题目链接:HDU 1166 敌兵布阵
树状数组。
下午刚学会树状数组,感觉不简单,慢慢学吧。
这个题必须得用c语言的输入输出,用c++的会超时。
#include <iostream> #include <cstring> #include <stdio.h> using namespace std; const int MAX_N = 50000 + 1000; int T,n,temp; int num[MAX_N]; char c[15]; int lowbit(int i) { return i & (-i); } int sum(int x) { int sum = 0; while (x > 0) { sum += num[x]; x -= lowbit(x); } return sum; } void add(int i,int val) { while (i <= n) { num[i] += val; i += lowbit(i); } } void sub(int i,int val) { while (i <= n) { num[i] -= val; i += lowbit(i); } } int main() { scanf("%d",&T); int cnt = 0; while(T--) { printf("Case %d:\n",++cnt); memset(num,0,sizeof(num)); scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%d",&temp); add(i,temp); } while(scanf("%s",c)) { if(c[0] == 'E') break; int a,b; scanf("%d %d",&a,&b); if(c[0] == 'Q') printf("%d\n", sum(b) - sum(a - 1)); else if(c[0] == 'A') add(a,b); else if(c[0] == 'S') sub(a,b); } } return 0; }