树状数组-敌兵布阵
题目描述:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h> #include<stdlib.h> int T; int e[50005]; int a[50005]; char op[10]; char oper; int add(int x) { int ad=0; for(int i=x-(x&-x)+1;i<=x;++i) ad+=e[i]; return ad; } void tree(int N) { for(int i=1;i<=N;++i) a[i]=add(i); } void gaibian(int i,int j,int N,bool ch) { j=(ch? j:(-j)); for(int k=i;k<=N;k+=(k&-k)) a[k]+=j; } int ques(int i,int j) { int sum1=0,sum2=0; for(int k=j;k>0;k-=(k&-k)) sum1+=a[k]; for(int k=i-1;k>0;k-=(k&-k)) sum2+=a[k]; return (sum1-sum2); } int main() { scanf("%d",&T); for(int l=1;l<=T;l++) { printf("Case %d:\n",l); int N; scanf("%d",&N); for(int i=1;i<=N;++i) scanf("%d",&e[i]); tree(N); while(1) { scanf("%s",op); oper=op[0]; int i,j; switch(oper) { case 'A': scanf("%d%d",&i,&j); gaibian(i,j,N,true); break; case 'S': scanf("%d%d",&i,&j); gaibian(i,j,N,false); break; case 'Q': scanf("%d%d",&i,&j); printf("%d\n",ques(i,j)); break; case 'E': break; } if(oper=='E') break; } } return 0; }

浙公网安备 33010602011771号