首页 > 代码库 > HDU 4902 Nice boat(线段树 区间更新)
HDU 4902 Nice boat(线段树 区间更新)
Nice boat
大意:给你一个区间,每次可以进行两种操作,1:把区间中的数全都变成x 2:把区间中大于x的数变成gcd(a[i], x),最后输出序列。
思路:线段树成段更行,用num数组的叶子存储数据,节点当作lazy来使用。
#include <stdio.h> const int maxn = 100005; int num[maxn<<2]; int gcd(int a, int b){ return b?gcd(b, a%b):a; } void PushUp(int id){ if(num[id<<1] == num[id<<1|1]){ num[id] = num[id<<1]; } } void PushDown(int id){ if(num[id] != -1){ num[id<<1] = num[id<<1|1] = num[id]; num[id] = -1; } } void Build(int l, int r, int id){ num[id] = -1; if(l == r){ scanf("%d", &num[id]); return ; } int mid = (l+r)>>1; Build(l, mid, id<<1); Build(mid+1, r, id<<1|1); PushUp(id); } void Update(int op, int L, int R, int t, int l, int r, int id){ if(op == 1){ if(L <= l && r <= R){ num[id] = t; return ; } } else if(op == 2){ if(L <= l && r <= R && num[id] != -1){ if(num[id] > t){ num[id] = gcd(num[id], t); } return ; } } PushDown(id); int mid = (l+r)>>1; if(L <= mid){ Update(op, L, R, t, l, mid, id<<1); } if(R > mid){ Update(op, L, R, t, mid+1, r, id<<1|1); } PushUp(id); } void Query(int l, int r, int id){ if(l == r){ printf("%d ", num[id]); return ; } PushDown(id); int mid = (l+r)>>1; Query(l, mid, id<<1); Query(mid+1, r, id<<1|1); } int T, n, m; int main() { scanf("%d", &T); while(T--){ scanf("%d", &n); Build(1, n, 1); scanf("%d", &m); while(m--){ int op, a, b, c; scanf("%d%d%d%d", &op, &a, &b, &c); Update(op, a, b, c, 1, n, 1); } Query(1, n, 1); puts(""); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。