您的位置:首页 > 其它

HDU 4902 Nice boat 线段树 区间更新

2015-10-09 15:28 447 查看
HDU 4902 Nice boat

题意:

一个序列, 两种操作.
1. 把一个区间全部更改为x
2. 把一个区间比x大的数全部修改为gcd(ai,x)

思路:

lazy tag
pushDown的原则是把该节点所有tag都推到子节点
所以分情况讨论一下即可 最后到叶节点直接更新数列

#include <bits/stdc++.h>
#define lson num<<1
#define rson num<<1|1
#define gl l,m,lson
#define gr m+1,r,rson
#define PARA int l=1,int r=n,int num=1
using namespace std;
const int MAXN = 1e5+100;

int n;
int val[MAXN];
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
struct SegTree
{
struct Node
{
int l,r;
int tag[2];
void init(int a,int b)
{
l=a,r=b;
tag[0]=tag[1]=-1;
}
void deal()
{
if(tag[0]!=-1)
val[l]=tag[0];
if(tag[1]!=-1&&val[l]>tag[1])
val[l]=gcd(tag[1],val[l]);

}
}st[MAXN<<2];
void init(PARA)
{
st[num].init(l,r);
int m=l+r>>1;
if(l!=r)
init(gl),init(gr);
}

void pushDown(int num)
{
int l=st[num].l,r=st[num].r;
if(l!=r)
{
if(st[num].tag[0]!=-1)
{
st[lson].tag[0]=st[num].tag[0];
st[rson].tag[0]=st[num].tag[0];
st[lson].tag[1]=-1;
st[rson].tag[1]=-1;
}
if(st[num].tag[1]!=-1)
{
if(st[lson].tag[0]!=-1)
{
if(st[lson].tag[0]>st[num].tag[1])
st[lson].tag[0]=gcd(st[lson].tag[0],st[num].tag[1]);
}
else
{
if(st[lson].tag[1]!=-1)
pushDown(lson);
st[lson].tag[1]=st[num].tag[1];
}
if(st[rson].tag[0]!=-1)
{
if(st[rson].tag[0]>st[num].tag[1])
st[rson].tag[0]=gcd(st[rson].tag[0],st[num].tag[1]);
}
else
{
if(st[rson].tag[1]!=-1)
pushDown(rson);
st[rson].tag[1]=st[num].tag[1];
}
}
}
else
st[num].deal();
st[num].tag[0]=-1;
st[num].tag[1]=-1;
}
void update(int a,int b,int f,int v,PARA)
{
pushDown(num);
if(a<=l&&r<=b)
st[num].tag[f]=v;
else
{
int m=l+r>>1;
if(b<=m)
update(a,b,f,v,gl);
else if(a>m)
update(a,b,f,v,gr);
else
update(a,b,f,v,gl),update(a,b,f,v,gr);
}
}
void dfs(PARA)
{
pushDown(num);
int m=l+r>>1;
if(l!=r)
dfs(gl),dfs(gr);
}
}soul;

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
soul.init();
int m;
scanf("%d",&m);
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
soul.update(b,c,a-1,d);
}
soul.dfs();
for(int i=1;i<=n;i++)
printf("%d ",val[i]);
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: