题目链接
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
Case 1: 6 33 59
#include <cstdio> using namespace std; const int maxn=55555; int sum[maxn<<2]; void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } /* 返回一层则进行回溯处理,将这一层的数据进行更新 */ void build(int l,int r,int rt){ if(l==r){ scanf("%d",&sum[rt]); 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 add ,int l,int r,int rt){ if(l==r){ sum[rt]+=add;//最底层进行加法 return; } int m=(l+r)>>1; if(p<=m){ update(p,add,l,m,rt<<1); }else{ update(p,add,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 ret=0; if(L<=m){ ret+=query(L,R,l,m,rt<<1); } if(R>m){ ret+=query(L,R,m+1,r,rt<<1|1); } return ret; } int main(){ int T,n; //freopen("D://imput.txt","r",stdin); scanf("%d",&T); for(int cas=1;cas<=T;cas++){ printf("Case %d:\n",cas); scanf("%d",&n); build(1,n,1); char op[10]; while(scanf("%s",op)){ if(op[0]=='E'){ break; } int a,b; scanf("%d%d",&a,&b); if(op[0]=='Q'){ printf("%d\n",query(a,b,1,n,1)); }else if(op[0]=='S'){ update(a,-b,1,n,1); }else{ update(a,b,1,n,1); } } } return 0; }
/* 树形数组在求区间和的妙用 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int T,n,a,xx,yy; char op[10]; int C[50000+5]; int lowbit(int x) { return x&(-x); } int sum(int x) {//通过最顶端的位子开始向最低处蔓延。 int ret=0; while(x>0) { ret+=C[x];//一个一个的加 x-=lowbit(x);//移动到下一个不在自己管辖的区域 } return ret; } void add(int pos,int d) { while(pos<=n) { C[pos]+=d;//从这个位子开始加。 pos+=lowbit(pos);//移动到下一个不在自己管辖的区域进行加减运算(便是移动到他的父节点的位置) } } int main() { //freopen("D://imput.txt","r",stdin); scanf("%d",&T); for(int i=1; i<=T; i++) { memset(C,0,sizeof(C)); printf("Case %d:\n",i); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a); add(i,a); } while(true) { scanf("%s",op); if(op[0]=='E') { break; } scanf("%d%d",&xx,&yy); if(op[0]=='A') { add(xx,yy); } else if(op[0]=='S') { add(xx,-yy); } else { printf("%d\n",sum(yy)-sum(xx-1));******************** } } } return 0; }