渣渣做的线段树入门的题
题目地址:hdu1166 敌兵布阵
#include<iostream> #include<cstdio> using namespace std; const int N = 50000+10; int a[N],p;//p是指向数组a的指针,每次新的数据记得初始化 int s_tree[3*N];//每个结点只存储工兵数量的和 void buit(int l,int r,int num){ if(l==r) {s_tree[num] = a[p++];return;} int mid = (l+r)/2; buit(l,mid,num*2); buit(mid+1,r,num*2+1); s_tree[num] = s_tree[num*2]+s_tree[num*2+1]; } int Query(int i,int j,int l,int r,int num){ int mid = (l+r)/2; if(i==l&&j==r) return s_tree[num]; else if(j<=mid){ return Query(i,j,l,mid,num*2); } else if(i>mid){ return Query(i,j,mid+1,r,num*2+1); } else{ return Query(i,mid,l,mid,num*2)+Query(mid+1,j,mid+1,r,num*2+1); } } void Add(int i,int j,int l,int r,int num){ if(i==l&&l==r){ s_tree[num]+=j; return ; } s_tree[num]+=j; int mid = (l+r)/2; if(i<=mid) Add(i,j,l,mid,num*2); else Add(i,j,mid+1,r,num*2+1); } void Sub(int i,int j,int l,int r,int num){ if(i==l&&l==r){ s_tree[num]-=j; return ; } s_tree[num]-=j; int mid = (l+r)/2; if(i<=mid) Sub(i,j,l,mid,num*2); else Sub(i,j,mid+1,r,num*2+1); } int main(){ int T,N; int i,j; int w = 1; char str[10]; cin>>T; while(T--){ cin>>N; p = 0; for(int k=0;k<N;k++){ scanf("%d",&a[k]); } buit(1,N,1); str[0] = 'B'; //cout<<"Case "<<w++<<":"<<endl; printf("Case %d:\n",w++); while(true){ //cin>>str; scanf("%s",str); if(str[0]=='E') break; //cin>>i>>j; scanf("%d%d",&i,&j); if(str[0]=='Q'){ printf("%d\n",Query(i,j,1,N,1)); } else if(str[0]=='A') Add(i,j,1,N,1); else if(str[0]=='S') Sub(i,j,1,N,1); } } return 0; }