1 10 16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 10 1 3 6 74243042 2 4 8 16531729 1 3 4 1474833169 2 1 8 1131570933 2 7 9 1505795335 2 3 7 101929267 1 4 10 1624379149 2 2 8 2110010672 2 6 7 156091745 1 2 5 937186357
16807 937186357 937186357 937186357 937186357 1 1 1624379149 1624379149 1624379149又是一道线段树,比上次的多校那个要容易一点#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define LL 100005 #define ll __int64 #define lson 2*i #define rson 2*i+1 #define ls l,mid,2*i #define rs mid+1,r,2*i+1 struct node { int l,r; ll num,maxn; } a[LL<<2]; int n,m; ll gcd(ll a,ll b) { if(!b) return a; else return gcd(b,a%b); } void PushUp(int i) { a[i].num=(a[lson].num==a[rson].num)?a[lson].num:-1; a[i].maxn=max(a[lson].maxn,a[rson].maxn); } void PushDown(int i) { if(a[i].num>-1) { a[lson].num = a[rson].num = a[i].num; a[lson].maxn = a[rson].maxn = a[i].maxn; } } void init(int l,int r,int i) { a[i].l = l; a[i].r = r; if(l == r) scanf("%I64d",&a[i].num); else { int mid = (l+r)>>1; init(ls); init(rs); PushUp(i); } } void change1(int L,int R,ll x,int i) { int l = a[i].l,r = a[i].r; if(L<=l && r<=R) { a[i].num = x; a[i].maxn = x; } else { int mid = (l+r)>>1; PushDown(i); if(mid>=R) change1(L,R,x,lson); else if(mid<L) change1(L,R,x,rson); else { change1(L,R,x,lson); change1(L,R,x,rson); } PushUp(i); } } void change2(int L,int R,ll x,int i) { int l = a[i].l,r = a[i].r; if(a[i].maxn<=x) return ; if(L<=l && r<=R) { if(a[i].num>-1) { a[i].num = gcd(a[i].num,x); a[i].maxn = a[i].num; } else { PushDown(i); change2(L,R,x,lson); change2(L,R,x,rson); PushUp(i); } } else { int mid = (l+r)>>1; PushDown(i); if(mid>=R) change2(L,R,x,lson); else if(mid<L) change2(L,R,x,rson); else { change2(L,R,x,lson); change2(L,R,x,rson); } PushUp(i); } } void print(int l,int r,int i) { if(a[i].num>-1) for(int j = l; j<=r; j++) printf("%I64d ",a[i].num); else { int mid = (l+r)>>1; print(ls); print(rs); } } int main() { int t,l,r,cas; __int64 x; scanf("%d",&t); while(t--) { scanf("%d",&n); init(1,n,1); scanf("%d",&m); while(m--) { scanf("%d%d%d%I64d",&cas,&l,&r,&x); if(cas == 1) change1(l,r,x,1); else change2(l,r,x,1); } print(1,n,1); printf("\n"); } }
HDU4902:Nice boat(线段树lazy),布布扣,bubuko.com
原文地址:http://blog.csdn.net/libin56842/article/details/38338025