题目:http://acm.hdu.edu.cn/showproblem.php?pid=1166
还是线段树入门题。。和1754类似。。
细节都没怎么考虑就AC了。。。开始还以为在减人数的时候应该要考虑的在细致一点的。哪知道不用。
下面是AC代码:
#include<iostream> using namespace std; #define N 50002 struct node { int l,m,r; int num; }trie[N*3]; void creat(int id,int beg,int end) { trie[id].l=beg; trie[id].r=end; trie[id].num=0; trie[id].m=(beg+end)>>1; if(beg<end) { creat(id*2,trie[id].l,trie[id].m); creat(id*2+1,trie[id].m+1,trie[id].r); } } void update(int id,int goal,int val) { if(trie[id].l==goal&&trie[id].r==goal) { trie[id].num+=val; return ; } else { if(trie[id].m>=goal) { trie[id].num+=val; update(id*2,goal,val); //在左子树 } else { trie[id].num+=val; update(id*2+1,goal,val); //在右子树 } } } void find(int id,int beg,int end,int &max) { if(trie[id].l==beg&&trie[id].r==end) { max+=trie[id].num; } else { if(trie[id].m>=end) { find(id*2,beg,end,max); } else if(trie[id].m<beg) { find(id*2+1,beg,end,max); } else { find(id*2,beg,trie[id].m,max); find(id*2+1,trie[id].m+1,end,max); } } } int main() { int n,i,t,a,b,ai; int k=1; char c[10]; cin>>t; while(t--) { cin>>n; creat(1,1,n); for(i=1;i<=n;i++) { scanf("%d",&ai); update(1,i,ai); } printf("Case %d:\n",k++); while(1) { scanf("%s",c); if(strcmp("End",c)==0) break; if(strcmp("Add",c)==0) { scanf("%d%d",&a,&b); update(1,a,b); } if(strcmp("Sub",c)==0) { scanf("%d%d",&a,&b); update(1,a,-b); } if(strcmp("Query",c)==0) { scanf("%d%d",&a,&b); int max=0; find(1,a,b,max); printf("%d\n",max); } } } return 0; }