题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意很简单~略
思路:纯粹的单点更新,线段树的入门题,当然,树状数组也很方便。
My code:
线段树版:
//STATUS:C++_AC_171MS_956KB #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> #include<queue> #include<math.h> #include<map> #include<set> using namespace std; #define LL __int64 #define pii pair<int,int> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int MAX=50010,INF=200000000; const double esp=1e-6; void build(int l,int r,int rt); void update(int l,int r,int rt); void query(int l,int r,int rt); int num[MAX],sum[MAX*4]; int T,n,a,b,ans; int main() { // freopen("in.txt","r",stdin); int i,k=1; char op[10]; scanf("%d",&T); while(T--) { printf("Case %d:\n",k++); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&num[i]); build(1,n,1); while(scanf("%s",op) && op[0]!='E') { scanf("%d%d",&a,&b); if(op[0]!='Q'){ if(op[0]=='S')b=-b; update(1,n,1); } else { ans=0; query(1,n,1); printf("%d\n",ans); } } } return 0; } void build(int l,int r,int rt) { if(l==r){ sum[rt]=num[l]; return; } int mid=(l+r)>>1; build(lson); build(rson); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void update(int l,int r,int rt) { sum[rt]+=b; if(l==r) return; int mid=(l+r)>>1; if(a<=mid)update(lson); else update(rson); } void query(int l,int r,int rt) { if(a<=l && r<=b){ ans+=sum[rt]; return; } int mid=(l+r)>>1; if(a<=mid)query(lson); if(b>mid)query(rson); }
树状数组版:
//STATUS:C++_AC_156MS_632KB #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> #include<queue> #include<math.h> #include<map> #include<set> using namespace std; #define LL __int64 #define pii pair<int,int> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int MAX=50010,INF=200000000; const double esp=1e-6; int num[MAX],c[MAX]; int T,n,a,b; int lowbit(int x){ return x&(-x); } void update(int i){ while(i<=n){ c[i]+=b; i+=lowbit(i); } } int sum(int i){ int s=0; while(i){ s+=c[i]; i-=lowbit(i); } return s; } int main() { // freopen("in.txt","r",stdin); int i,k=1; char op[10]; scanf("%d",&T); while(T--) { printf("Case %d:\n",k++); scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&num[i]); num[i]+=num[i-1]; } for(i=1;i<=n;i++) c[i]=num[i]-num[i-lowbit(i)]; while(scanf("%s",op) && op[0]!='E') { scanf("%d%d",&a,&b); if(op[0]!='Q'){ if(op[0]=='S')b=-b; update(a); } else printf("%d\n",sum(b)-sum(a-1)); } } return 0; }