HDU 1166 敵兵佈陣 樹狀陣列模板
參考部落格:https://blog.csdn.net/Small_Orange_glory/article/details/81290634
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 MAXN=50006; int c[MAXN+1]; int lowbit(int x) { return x&(-x); } //取 int lowbits(int x) { return x&(-x); } int sum(int x)//此處x可以為0 { int res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } int sums(int x) { int res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } void add(int x,int v)//x必須大於0 { while(x<=MAXN) { c[x] +=v; x+=lowbit(x); } } void adds(int x,int v) { while(x<=MAXN) { c[x]+=v; x+=lowbit(x); } } int main() { int T,kase=1; scanf("%d",&T); while(T--) { printf("Case %d:\n",kase++); int n; scanf("%d",&n); memset(c,0,sizeof(c)); for(int i=1; i<=n; i++) { int v; scanf("%d",&v); adds(i,v); } char str[10]; while(scanf("%s",str)==1) { if(str[0]=='E') break; else if(str[0]=='Q') { int i,j; scanf("%d%d",&i,&j); printf("%d\n",sums(j)-sum(i-1)); } else if(str[0]=='A') { int x,v; scanf("%d%d",&x,&v); adds(x,v); } else if(str[0]=='S') { int x,v; scanf("%d%d",&x,&v); adds(x,-v); } } } return 0; }