标签:des style blog http color java os strong
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 968 Accepted Submission(s): 441
【题目大意】
给你一串数字,有两个操作,1表示把一段区间内的数变成x,2表示把一段区间内的数如果这个数大于x则变为这个数与x的最小公约数,否则不变。最后输出变化后的一组数。
【题目分析】
这题和其他线段树有一些区别,这题是在所有的处理结束后才全部输出。
我们在每个结点中加一个flag标记该区间内的数字是否都是同一个,如果区间是同一个数的话我们就可以进行批处理,这将会大大降低时间复杂度。
再用一个temp来存储该结点的val,然后在pushdown函数将temp的值一层一层的传递下去。
这里的temp既起到了该结点是否已经向下更新的作用(相当于lazy),又起到了记录子节点需要更新的值的作用。
temp只有在val的值改变的时候才改变。
//Memory Time
// 5376K 651MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 100100
#define LL long long
using namespace std;
int n,m;
int ans;
int num[MAX];
struct Tree
{
int l,r;
bool flag;
int val,temp;
};
Tree tree[MAX<<2];
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
void pushup(int x)
{
int tmp=x<<1;
tree[x].val=max(tree[tmp].val,tree[tmp+1].val);
tree[x].flag=(tree[tmp].val==tree[tmp+1].val&&tree[tmp].flag&&tree[tmp+1].flag);
}
void pushdown(int x)
{
if(tree[x].temp==-1)return;
int tmp=x<<1;
int mid=(tree[x].l+tree[x].r)>>1;
tree[tmp].val=tree[tmp+1].val=tree[tmp].temp=tree[tmp+1].temp=tree[x].temp;
tree[x].temp=-1;
}
void build(int l,int r,int x)
{
tree[x].flag=0;
tree[x].temp=-1;
tree[x].l=l,tree[x].r=r;
if(l==r)
{
scanf("%d",&tree[x].val);
tree[x].flag=1;
return;
}
int tmp=x<<1;
int mid=(l+r)>>1;
build(l,mid,tmp);
build(mid+1,r,tmp+1);
pushup(x);
}
void update(int l,int r,int num,int x)
{
if(r<tree[x].l||l>tree[x].r)return;
if(l<=tree[x].l&&r>=tree[x].r)
{
tree[x].flag=1;
tree[x].val=num;
tree[x].temp=num;
return;
}
pushdown(x);
int tmp=x<<1;
int mid=(tree[x].l+tree[x].r)>>1;
if(r<=mid)
update(l,r,num,tmp);
else if(l>mid)
update(l,r,num,tmp+1);
else
{
update(l,mid,num,tmp);
update(mid+1,r,num,tmp+1);
}
pushup(x);
}
void change(int l,int r,int num,int x)
{
if(r<tree[x].l||l>tree[x].r)return;
if(tree[x].flag&&tree[x].val<=num)return;
if(l<=tree[x].l&&r>=tree[x].r&&tree[x].flag)
{
tree[x].val=gcd(tree[x].val,num);
tree[x].temp=tree[x].val;
return;
}
pushdown(x);
int tmp=x<<1;
int mid=(tree[x].l+tree[x].r)>>1;
if(r<=mid)
change(l,r,num,tmp);
else if(l>mid)
change(l,r,num,tmp+1);
else
{
change(l,mid,num,tmp);
change(mid+1,r,num,tmp+1);
}
pushup(x);
}
void query(int l,int r,int k,int x)
{
if(k<tree[x].l||k>tree[x].r)return;
if(tree[x].flag)
{
ans=tree[x].val;
return;
}
pushdown(x);
int tmp=x<<1;
int mid=(tree[x].l+tree[x].r)>>1;
if(k<=mid)
query(l,mid,k,tmp);
else
query(mid+1,r,k,tmp+1);
}
int main()
{
int T;
int t,l,r,num;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d %d %d %d",&t,&l,&r,&num);
if(t==1)
update(l,r,num,1);
else
change(l,r,num,1);
}
for(int i=1;i<=n;i++)
{
ans=0;
query(1,n,i,1);
printf("%d ",ans);
}
puts("");
}
return 0;
}
线段树 + 区间更新 ----- HDU 4902 : Nice boat,布布扣,bubuko.com
线段树 + 区间更新 ----- HDU 4902 : Nice boat
标签:des style blog http color java os strong
原文地址:http://www.cnblogs.com/acmer-jsb/p/3885433.html