HDU 4902 Nice boat 线段树 区间更新
2015-10-09 15:28
447 查看
HDU 4902 Nice boat
1. 把一个区间全部更改为x
2. 把一个区间比x大的数全部修改为gcd(ai,x)
pushDown的原则是把该节点所有tag都推到子节点
所以分情况讨论一下即可 最后到叶节点直接更新数列
题意:
一个序列, 两种操作.1. 把一个区间全部更改为x
2. 把一个区间比x大的数全部修改为gcd(ai,x)
思路:
lazy tagpushDown的原则是把该节点所有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; }
相关文章推荐
- AndroidManifest.xml文件详解(uses-feature)
- chcon可实现对文件的SEAndroid安全标签的修改
- javascript常用对象
- jquery ajax post格式
- 【FAQ】Gerrit创建xxx/xxx这种多目录层次类型的project报错?
- 五种创建UIImage的类方法
- Kubernetes管理基本教程
- iOS开发之Objective-C与JavaScript的交互
- hdu5242Game(好题)
- Integer to Roman
- 【转】使用dos2unix批量转换文件
- 关于webstorm(phpstorm)设置了编码格式之后还是乱码的问题
- linux动态链接库的编译及使用<二>
- LeetCode——Word Pattern的JavaScript的实现
- od命令 查看文件的二进制内容
- 如何取消use as source folder
- 如何加载控制器View
- linux系统的CPU和memory监视
- Android:@id和@+id
- 移动端的touch事件处理