题目链接:自己找去==
题目思路:嗯。。。点修改,区间查询。。当成这两个的模板题。。这两个都在学,还不是太会。。
线段树:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 50010;
struct Tree{int l,r,nn;}node[3*maxn];
void build(int n,int l,int r) //建树
{
int m=(l+r)/2;
node[n].nn=0;
node[n].l=l;
node[n].r=r;
if(l!=r)
{
build(n*2,l,m);
build(n*2+1,m+1,r);
}
}
void change(int n,int num,int s) //更新
{
int m=(node[n].l+node[n].r)/2;
if(node[n].l==node[n].r) node[n].nn+=s;
else if(num<=m)
{
node[n].nn+=s;
change(n*2,num,s);
}
else
{
node[n].nn+=s;
change(n*2+1,num,s);
}
}
int sum(int n,int l,int r) //查找或者输出
{
int m=(node[n].l+node[n].r)/2;
if(node[n].l==l&&node[n].r==r) return node[n].nn;
else if(r<=m) return sum(n*2,l,r);
else if(l>m) return sum(n*2+1,l,r);
else return sum(n*2,l,m)+sum(n*2+1,m+1,r);
}
int main()
{
int t,cas=1,n,nn,k;
char s[10];
cin>>t;
while(t--){
cin>>n;
int a;
build(1,1,n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
change(1,i,a);
}
printf("Case %d:\n",cas++);
getchar();
while(1)
{
scanf("%s",s);
if(s[0]=='E') break;
else if(s[0]=='A')
{
scanf("%d%d",&nn,&k);
change(1,nn,k);
}
else if(s[0]=='S')
{
scanf("%d%d",&nn,&k);
change(1,nn,-k);
}
else if(s[0]=='Q')
{
scanf("%d%d",&nn,&k);
printf("%d\n",sum(1,nn,k));
}
}
}
return 0;
}
树状数组:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 50010;
int n,num[maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int nn,int x)
{
while(nn<=n){
num[nn]+=x;
nn+=lowbit(nn);
}
}
int get_sum(int a,int b)
{
int sa=0,sb=0;
a--;
while(a>0)
{
sa+=num[a];
a-=lowbit(a);
}
while(b>0)
{
sb+=num[b];
b-=lowbit(b);
}
return sb-sa;
}
int main()
{
int t;
cin>>t;
for(int cas=1;cas<=t;cas++){
memset(num,0,sizeof(num));
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
update(i,a);
}
char s[10];
int nn,k;
printf("Case %d:\n",cas);
getchar();
while(1)
{
scanf("%s",s);
if(s[0]=='E') break;
else if(s[0]=='A')
{
scanf("%d%d",&nn,&k);
update(nn,k);
}
else if(s[0]=='S')
{
scanf("%d%d",&nn,&k);
update(nn,-k);
}
else if(s[0]=='Q')
{
scanf("%d%d",&nn,&k);
printf("%d\n",get_sum(nn,k));
}
}
}
return 0;
}