hdu1166 敌兵布阵
作者:互联网
线段树模板题
线段树我是拿一个结构体(struct)存的:
struct Tree {int l,r,len;}a[(N<<2)+10];
建树:
void Build(int l,int r,int s)//建树
{
a[s].l=l;
a[s].r=r;
a[s].len=r-l+1;
if(l==r)//叶子节点,返回
{
b[s]=num[l];
return;
}
int mid=(r+l)>>1;
Build(l,mid,s<<1);//建左子树
Build(mid+1,r,(s<<1)|1);//建右子树
b[s]=b[s<<1]+b[(s<<1)|1];
}
区间求和(查询):
int query(int l,int r,int s)//区间查询
{
if(a[s].l>=l&&a[s].r<=r) return b[s];//完全包含,直接返回
int ans=0;
if(a[s<<1].r>=l) ans+=query(l,r,s<<1);//处理左子树
if(a[(s<<1)|1].l<=r) ans+=query(l,r,(s<<1)|1);//处理右子树
return ans;
}
单点更新:
void change(int s,int x,int v)//单点更新
{
if(a[s].l==a[s].r) {b[s]+=v;return;}//到达叶子节点,修改
int mid=(a[s].l+a[s].r)>>1;
if(x<=mid) change(s<<1,x,v);//处理左子树
else change((s<<1)|1,x,v);//处理右子树
b[s]=b[s<<1]+b[(s<<1)|1];//更新
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
#define N 50000
struct Tree {int l,r,len;}a[(N<<2)+10];
int b[(N<<2)+10],num[N+10];
void Build(int l,int r,int s)
{
a[s].l=l;
a[s].r=r;
a[s].len=r-l+1;
if(l==r)
{
b[s]=num[l];
return;
}
int mid=(r+l)>>1;
Build(l,mid,s<<1);
Build(mid+1,r,(s<<1)|1);
b[s]=b[s<<1]+b[(s<<1)|1];
}
int query(int l,int r,int s)
{
if(a[s].l>=l&&a[s].r<=r) return b[s];
int ans=0;
if(a[s<<1].r>=l) ans+=query(l,r,s<<1);
if(a[(s<<1)|1].l<=r) ans+=query(l,r,(s<<1)|1);
return ans;
}
void change(int s,int x,int v)
{
if(a[s].l==a[s].r) {b[s]+=v;return;}
int mid=(a[s].l+a[s].r)>>1;
if(x<=mid) change(s<<1,x,v);
else change((s<<1)|1,x,v);
b[s]=b[s<<1]+b[(s<<1)|1];
}
int main()
{
int T,c=0;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
Build(1,n,1);
string str;
char s[10];
++c;
printf("Case %d:\n",c);
while(1)
{
scanf("%s",s);
if(!strcmp(s,"Query"))
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r,1));
}
else if(!strcmp(s,"Add"))
{
int u,val;
scanf("%d%d",&u,&val);
change(1,u,val);
}
else if(!strcmp(s,"Sub"))
{
int u,val;
scanf("%d%d",&u,&val);
change(1,u,-val);
}
else if(!strcmp(s,"End")) break;
}
}
return 0;
}
标签:struct,int,mid,len,敌兵,Build,hdu1166,query,布阵 来源: https://www.cnblogs.com/juruo-zzt/p/12088018.html