很水的一道题。单点更新
线段树代码
先取最小的n使2^n>=所表示范围,则线段树节点个数应为2^(n+1);
#include<stdio.h>
#include<string.h>
int n;
struct Tree{
int s;
int t;
int sum;
}tree[140000];
void build(int s,int t,int id){
tree[id].s=s;
tree[id].t=t;
tree[id].sum=0;
if(s!=t){
int mid=(s+t)>>1;
build(s,mid,id*2);
build(mid+1,t,id*2+1);
}
}
void update(int id,int i,int tem){
tree[id].sum+=tem;
if(tree[id].s==tree[id].t)
return;
int mid=(tree[id].s+tree[id].t)>>1;
if(mid>=i)
update(id*2,i,tem);
else
update(id*2+1,i,tem);
}
int query(int id,int s,int t){
if(tree[id].s==tree[id].t)
return tree[id].sum;
if(tree[id].s==s && t==tree[id].t)
return tree[id].sum;
int mid=(tree[id].s+tree[id].t)>>1;
if(mid>=t)
return query(id*2,s,t);
else if(s>mid)
return query(id*2+1,s,t);
else
return query(id*2,s,mid)+query(id*2+1,mid+1,t);
}
int main(){
int T,t,i,tem;
scanf("%d",&T);
for(t=1;t<=T;t++){
printf("Case %d:\n",t);
scanf("%d",&n);
build(1,n,1);
for(i=1;i<=n;i++){
scanf("%d",&tem);
update(1,i,tem);
}
char m[10];
while(scanf("%s",m)){
if(m[0]=='E')
break;
if(m[0]=='A'){
int p,q;
scanf("%d %d",&p,&q);
update(1,p,q);
}
if(m[0]=='S'){
int p,q;
scanf("%d %d",&p,&q);
update(1,p,-q);
}
if(m[0]=='Q'){
int p,q;
scanf("%d %d",&p,&q);
printf("%d\n",query(1,p,q));
}
}
}
}
树状数组代码
#include<stdio.h>
#include<string.h>
int n,c[50010];
int lowbit(int x){
return x&(x^(x-1));
}
int sum(int x){
int s=0;
while(x>0){
s+=c[x];
x-=lowbit(x);
}
return s;
}
void update(int x,int val){
while(x<=n){
c[x]+=val;
x+=lowbit(x);
}
}
int main(){
int T,t,i,tem;
scanf("%d",&T);
for(t=1;t<=T;t++){
printf("Case %d:\n",t);
scanf("%d",&n);
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d",&tem);
update(i,tem);
}
char m[10];
while(scanf("%s",m)){
if(m[0]=='E')
break;
if(m[0]=='A'){
int p,q;
scanf("%d %d",&p,&q);
update(p,q);
}
if(m[0]=='S'){
int p,q;
scanf("%d %d",&p,&q);
update(p,-q);
}
if(m[0]=='Q'){
int p,q;
scanf("%d %d",&p,&q);
if(p==1)
printf("%d\n",sum(q));
else
printf("%d\n",sum(q)-sum(p-1));
}
}
}
}