敵兵佈陣 (樹狀陣列應用型別一)【單點更新與區間求和】
題目連線:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C國的死對頭A國這段時間正在進行軍事演習,所以C國間諜頭子Derek和他手下Tidy又開始忙乎了。A國在海岸線沿直線佈置了N個工兵營地,Derek和Tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數C國都掌握的一清二楚,每個工兵營地的人數都有可能發生變動,可能增加或減少若干人手,但這些都逃不過C國的監視。
Input 第一行一個整數T,表示有T組資料。
Output 對第i組資料,首先輸出“Case i:”和回車,
Sample Input
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
Sample Output
Case 1: 6 33 59 |
程式碼:
#include<cstdio> #include<cstring> using namespace std; const int N=50008; int c[N]; /*int lowbit(int x) { return (x&(-x)); }*/ void add(int x,int y) { for(;x<=N;x+=(x&(-x))) { c[x]+=y; } } int sum(int x) { int ans=0; for(;x;x-=(x&(-x))) { ans+=c[x]; } return ans; } int main() { int T,Case=1; scanf("%d",&T); while(T--) { memset(c,0,sizeof(c)); printf("Case %d:\n",Case++); int n,val; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&val); add(i,val); } char s1[10]; while(scanf("%s",s1)==1) { if(s1[0]=='E') { break; } else if(s1[0]=='A') { int x,v; scanf("%d%d",&x,&v); add(x,v); } else if(s1[0]=='S') { int x,v; scanf("%d%d",&x,&v); add(x,-v); } else { int x,v; scanf("%d%d",&x,&v); printf("%d\n",(sum(v)-sum(x-1))); } } } return 0; }