题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意简述:中文题。 解题思路:线段树。先建树,然后根据要求进行插入和统计操作即可。很好写,1y。 代码: #include<stdio.h> #include<iostream> #include<string.h> using namespace std; const int Len=50005; struct lintTree{ int l,r; int value; }T[5*Len]; void Build_Tree(int ll,int rr,int num) { T[num].l=ll,T[num].r=rr; T[num].value=0; if(rr-ll<=1) return; int mid=(ll+rr)>>1; Build_Tree(ll,mid,2*num); Build_Tree(mid,rr,2*num+1); } void Insert(int ll,int rr,int value,int num) { T[num].value+=value; if(T[num].l==ll&&T[num].r==rr) return; int mid=(T[num].l+T[num].r)>>1; if(rr<=mid) Insert(ll,rr,value,2*num); else if(ll>=mid) Insert(ll,rr,value,2*num+1); else { Insert(ll,mid,value,2*num); Insert(mid,rr,value,2*num+1); } } int Count(int ll,int rr,int num) { if(T[num].l==ll&&T[num].r==rr) return T[num].value; int mid=(T[num].l+T[num].r)>>1; if(rr<=mid) return Count(ll,rr,2*num); else if(ll>=mid) return Count(ll,rr,2*num+1); else return (Count(ll,mid,2*num)+Count(mid,rr,2*num+1)); } int main() { int t; int Case=0; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); Build_Tree(1,n+1,1); for(int i=1;i<=n;++i) { int temp; scanf("%d",&temp); Insert(i,i+1,temp,1); } printf("Case %d:/n",++Case); char in[10]; while(cin>>in) { int num1,num2; if(!strcmp(in,"Query")) { scanf("%d%d",&num1,&num2); int ans=Count(num1,num2+1,1); printf("%d/n",ans); } else if(!strcmp(in,"Add")) { scanf("%d%d",&num1,&num2); Insert(num1,num1+1,num2,1); } else if(!strcmp(in,"Sub")) { scanf("%d%d",&num1,&num2); Insert(num1,num1+1,-num2,1); } else if(!strcmp(in,"End")) break; } } return 0; }