【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵

时间:2023-03-09 20:43:29
【算法系列学习】线段树vs树状数组 单点修改,区间查询  [kuangbin带你飞]专题七 线段树 A - 敌兵布阵

https://vjudge.net/contest/66989#problem/A

单点修改,区间查询

方法一:线段树

http://www.cnblogs.com/kuangbin/archive/2011/08/15/2139834.html

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib> using namespace std;
const int maxn=5e4+;
const int inf=0x3f3f3f3f;
int num[maxn];
int n;
struct Node
{
int l;
int r;
int nSum;
}segTree[maxn<<]; void Build(int i,int l,int r)
{
segTree[i].l=l;
segTree[i].r=r;
if(l==r)
{
segTree[i].nSum=num[l];
return;
}
int mid=(l+r)>>;
Build(i<<,l,mid);
Build((i<<)|,mid+,r);
segTree[i].nSum=segTree[i<<].nSum+segTree[(i<<)|].nSum;
} void Add(int i,int t,int b)
{
segTree[i].nSum+=b;
if(segTree[i].l==segTree[i].r)
{
return;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(t<=mid)
{
Add(i<<,t,b);
}
else
{
Add((i<<)|,t,b);
}
} int Query(int i,int l,int r)
{
if(segTree[i].l==l&&segTree[i].r==r)
{
return segTree[i].nSum;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(r<=mid)
{
return Query(i<<,l,r);
}
else if(l>mid)
{
return Query((i<<)|,l,r);
}
else
{
return Query(i<<,l,mid)+Query((i<<)|,mid+,r);
}
}
int main()
{
int T;
scanf("%d",&T);
int kas=;
while(T--)
{
printf("Case %d:\n",kas++);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&num[i]);
}
Build(,,n);
char ch[];
int a,b;
while(scanf("%s",ch)==&&ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='Q')
{
int ans=Query(,a,b);
printf("%d\n",ans);
}
else if(ch[]=='A')
{
Add(,a,b);
}
else
{
Add(,a,-b);
}
}
}
return ;
}

方法二:树状数组

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib> using namespace std;
const int maxn=5e4+;
const int inf=0x3f3f3f3f;
int tree[maxn];
int n;
void Init()
{
memset(tree,,sizeof(tree));
}
int lowbit(int x)
{
return x&-x;
} void Add(int i,int x)
{
while(i<=n)
{
tree[i]+=x;
i+=lowbit(i);
}
} int Query(int i)
{
int res=;
while(i)
{
res+=tree[i];
i-=lowbit(i);
}
return res;
} void Setval(int i,int x)
{
int v=Query(i)-Query(i-);
Add(i,-v);
Add(i,x);
} int Query(int l,int r)
{
return Query(r)-Query(l-);
} int main()
{
int T;
scanf("%d",&T);
for(int kas=;kas<=T;kas++)
{
Init();
scanf("%d",&n);
int x;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
Add(i,x);
}
printf("Case %d:\n",kas);
char ch[];
int a,b;
while(scanf("%s",ch)==&&ch[]!='E')
{
scanf("%d%d",&a,&b);
if(ch[]=='A')
{
Add(a,b);
}
else if(ch[]=='S')
{
Add(a,-b);
}
else
{
int ans=Query(a,b);
printf("%d\n",ans);
}
}
}
return ;
}