1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
//考查知识点:树状数组 线段树, #include<stdio.h> #include<string.h> #define maxn 50010 int a[maxn]; char s[10]; int lowbit(int x) { <span style="white-space:pre"> </span>//return x&-x; <span style="white-space:pre"> </span>return x&(x^(x-1)); } void insert(int x,int add) { <span style="white-space:pre"> </span>while(x<maxn)//上溯的时候所有经过的点 <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>a[x]+=add; <span style="white-space:pre"> </span>x+=lowbit(x);//从包含x的一个子集中,到达另一个子集中 <span style="white-space:pre"> </span>} } int sum(int n) { <span style="white-space:pre"> </span>int sum1=0; <span style="white-space:pre"> </span>while(n>0)//包含的n个数 一定包含 最后面的a[n]从后往前,即向下追寻的所有路过的子集和都加上 <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>sum1+=a[n]; <span style="white-space:pre"> </span>n-=lowbit(n);//从一个子集和中转移到另一个子集中 <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return sum1; } int main() { <span style="white-space:pre"> </span>int t; <span style="white-space:pre"> </span>int count=1; <span style="white-space:pre"> </span>scanf("%d",&t); <span style="white-space:pre"> </span>while(t--) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int i,j,n,m; <span style="white-space:pre"> </span>scanf("%d",&n); <span style="white-space:pre"> </span>memset(a,0,sizeof(a)); <span style="white-space:pre"> </span>for(i=1;i<=n;++i) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>scanf("%d",&m); <span style="white-space:pre"> </span>insert(i,m); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>printf("Case %d:\n",count++); <span style="white-space:pre"> </span>int pos,num; <span style="white-space:pre"> </span>getchar(); <span style="white-space:pre"> </span>while(1)//有可能有多次所以加一个while(1) 循环 <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>gets(s);//此处不能使用gets 。汗 <span style="white-space:pre"> </span>scanf("%s",s); <span style="white-space:pre"> </span>if(s[0]=='A') <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>scanf("%d%d",&pos,&num); <span style="white-space:pre"> </span>insert(pos,num); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>if(s[0]=='S') <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>scanf("%d%d",&pos,&num); <span style="white-space:pre"> </span>insert(pos,-num); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>if(s[0]=='Q') <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>scanf("%d%d",&pos,&num); <span style="white-space:pre"> </span>printf("%d\n",sum(num)-sum(pos-1)); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>if(s[0]=='E') <span style="white-space:pre"> </span>break; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return 0; }
原文:http://blog.csdn.net/ice_alone/article/details/44784853