线段树实现

来源:互联网 发布:淘宝商家佣金怎么算 编辑:程序博客网 时间:2024/06/06 01:15








#include <iostream>#include <cstring>using namespace std;struct tree{int l;int r;int sum; } t[140000];  int people[50010],SUM=0;  void make(int x,int y,int num) { t[num].l=x; t[num].r=y; if(x==y)    t[num].sum=x; else { make(x,(x+y)/2,num*2); make((x+y)/2+1,y,num*2+1); t[num].sum=t[num*2].sum+t[num*2+1].sum; } }   void add(int i,int j,int num)//第i个堡垒加j个飞船  { t[num].sum+=j; if(t[num].l==i&&t[num].r==i) return; if(i>(t[num].l+t[num].r)/2)   add(i,j,num*2+1); else add(i,j,num*2); }    void sub(int i,int j,int num)//第i个堡垒减j个飞船  { t[num].sum-=j; if(t[num].l==i&&t[num].r==i)return; if(i>(t[num].l+t[num].r)/2)     sub(i,j,num*2+1);     else sub(i,j,num*2); }  void query(int i,int j,int num) { if(i<=t[num].l&&j>=t[num].r)  SUM+=t[num].sum; else { int min=(t[num].l+t[num].r)/2; if(i>min)   query(i,j,num*2+1); else if(j<=min)   query(i,j,num*2); else { query(i,j,num*2); query(i,j,num*2+1); } } }  int main() {  int n,t,i,j;    char command[6];    cin>>t;    j=0;    while(t--)    {      int temp,a,b;      cin>>n;      people[0]=0;      for(i=1;i<=n;i++)        cin>>people[i];      make(1,n,1);//从 根节点t[1]开始      cout<<"Case "<<++j<<":"<<endl;      while(cin>>command)      {        if(strcmp(command,"End")==0)          break;        else if(strcmp(command,"Query")==0)        {          cin>>a>>b;          SUM=0;//初始为零          query(a,b,1);//从 根节点t[1]开始          cout<<SUM<<endl;        }      else if(strcmp(command,"Add")==0)        {          cin>>a>>b;          add(a,b,1);//从 根节点t[1]开始        }      else if(strcmp(command,"Sub")==0)        {          cin>>a>>b;          sub(a,b,1);//从 根节点t[1]开始        }      }    }    return 0;   } 


0 0
原创粉丝点击