hdu 1166 敌兵布阵(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意:
已知初始时n个营地的人数以及之后的变化情况,试在变化过程中计算某一区间营地的人数和。
(1≤n≤50000,每组数据最多有40000条命令)
思路:
树状数组入门题。
#include <bits/stdc++.h> using namespace std; #define lowbit(a) ((a)&(-a)) const int M=55000; int c[M]; void update(int x,int y,int n) { for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y; } int getsum(int x) { int ans=0; for(int i=x;i;i-=lowbit(i)) ans+=c[i]; return ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); int t;cin>>t; for(int i=1;i<=t;i++) { int n;cin>>n; memset(c,0,(n+1)<<2); for(int x=1;x<=n;x++) { int y;cin>>y; update(x,y,n); } cout<<"Case "<<i<<":"<<"\n"; while(true) { string s;cin>>s; if(s[0]=='E') break; int x,y;cin>>x>>y; if(s[0]=='Q') cout<<getsum(y)-getsum(x-1)<<"\n"; else if(s[0]=='A') update(x,y,n); else update(x,-y,n); } } return 0; }