您的位置:首页 > 其它

hihocoder1078 线段树的区间修改

2017-06-03 08:25 267 查看

线段树

题目传送门

线段树区间改值,需要用到lazy思想,不然很容易TLE。不会的小伙伴戳这里

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100000
using namespace std;
struct cai{
int l;
int r;
int sum;
};
cai t[4*MAXN+5];
int a[MAXN+5],lazy[4*MAXN+5],n,m,l,r,q,f,w,ans;
void build(int l,int r,int num)
{
t[num].l=l;
t[num].r=r;
if (l==r)
{
t[num].sum=a[l];
return;
}
else
{
build(l,(l+r)/2,num*2);
build((l+r)/2+1,r,num*2+1);
t[num].sum=t[num*2].sum+t[num*2+1].sum;
}
}
void change(int l,int r,int w,int num)
{
if (t[num].l>=l&&t[num].r<=r)
{
lazy[num]=w;
t[num].sum=(t[num].r-t[num].l+1)*lazy[num];
}
else
{
if (lazy[num])
{
lazy[num*2]=lazy[num*2+1]=lazy[num];
t[num*2].sum=(t[num*2].r-t[num*2].l+1)*lazy[num];
t[num*2+1].sum=(t[num*2+1].r-t[num*2+1].l+1)*lazy[num];
lazy[num]=0;
}
int mid=(t[num].l+t[num].r)/2;
if (l<=mid)
change(l,r,w,num*2);
if (mid<r)
change(l,r,w,num*2+1);
t[num].sum=t[num*2].sum+t[num*2+1].sum;
}
}
int search(int l,int r,int num)
{
if (t[num].l>=l&&t[num].r<=r)
return t[num].sum;
int mid=(t[num].l+t[num].r)/2;
if (lazy[num])
{
lazy[num*2]=lazy[num*2+1]=lazy[num];
t[num*2].sum=(t[num*2].r-t[num*2].l+1)*lazy[num];
t[num*2+1].sum=(t[num*2+1].r-t[num*2+1].l+1)*lazy[num];
lazy[num]=0;
}
int ans=0;
if (l<=mid)
ans+=search(l,r,num*2);
if (mid<r)
ans+=search(l,r,num*2+1);
return ans;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,n,1);
scanf("%d",&q);
for (int i=1;i<=q;i++)
{
scanf("%d%d%d",&f,&l,&r);
if (f)
{
scanf("%d",&w);
change(l,r,w,1);
}
else
{
ans=search(l,r,1);
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: