传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1166
源代码:
树状数组: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=50005; int a[MAXN],bit[MAXN]; int n; int lowbit(int i){ return i&(-i); } void build(){ bit[0]=0; for(int i=1;i<=n;i++){ bit[i]=a[i]; for(int j=i-1;j>=i-lowbit(i)+1;j--) bit[i]+=a[j]; } } int getresult(int k){ int ans=0; while(k>0){ ans+=bit[k]; k-=lowbit(k); } return ans; } void add(int k,int value){ while(k<=n){ bit[k]+=value; k+=lowbit(k); } } int main(){ int t; cin>>t; for(int k=1;k<=t;k++){ printf("Case %d: ",k); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(); char str[10]; while(scanf("%s",str)&&str[0]!='E'){ int a,b; scanf("%d%d",&a,&b); if(str[0]=='Q'){ printf("%d ",getresult(b)-getresult(a-1)); }else if(str[0]=='A'){ add(a,b); }else{ add(a,-b); } } } } 线段树: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=50005; int a[MAXN],sum[MAXN<<2]; int N; inline void PushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt){ if(l==r){ sum[rt]=a[l]; return ; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); PushUp(rt); } void Build(int l,int r,int rt) { if(l == r) { sum[rt]=a[l]; return; } int m = (l + r) >> 1; //递归构造左右子树 Build(l,m,rt<<1); Build(m+1,r,rt<<1|1); PushUp(rt); } void update(int p,int value,int l,int r,int rt){ if(l==r){ sum[rt]+=value; return; } int m=(l+r)>>1; if(p<=m) update(p,value,l,m,rt<<1); else update(p,value,m+1,r,rt<<1|1); PushUp(rt); } int query(int L,int R,int l,int r,int rt) { if(L <= l && r <= R)//查询区间和要求的区间有没有交集 return sum[rt]; int m = (l + r) >> 1; int ans = 0; if(L <= m) ans += query(L,R,l,m,rt<<1); if(R > m) ans += query(L,R,m+1,r,rt<<1|1); return ans; } void solve(){ char chioce[10]; while(scanf("%s",chioce)){ if(chioce[0]=='E') break; int p,value; scanf("%d%d",&p,&value); if(chioce[0]=='S') update(p,-value,1,N,1); else if(chioce[0]=='A') update(p,value,1,N,1); else printf("%d ",query(p,value,1,N,1)); } } int main(){ int t; scanf("%d",&t); for(int j=1;j<=t;j++){ printf("Case %d: ",j); scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); build(1,N,1); solve(); } return 0; }