区间线段树。题目还不错。
1 /* */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <vector> 8 #include <algorithm> 9 #include <cstdio> 10 #include <cmath> 11 #include <cstring> 12 #include <climits> 13 #include <cctype> 14 using namespace std; 15 16 #define lson l, mid, rt<<1 17 #define rson mid+1, r, rt<<1|1 18 #define MAXN 100005 19 20 typedef struct { 21 int mx, val; 22 } node_t; 23 24 node_t T[MAXN<<2]; 25 int n, m, x; 26 int l; 27 28 int gcd(int n, int m) { 29 if (m == 0) 30 return n; 31 if (m > n) 32 return gcd(m, n); 33 return gcd(m, n%m); 34 } 35 36 void PushUp(int rt) { 37 T[rt].val = T[rt<<1].val==T[rt<<1|1].val ? T[rt<<1].val:-1; 38 T[rt].mx = max(T[rt<<1].mx, T[rt<<1|1].mx); 39 } 40 41 void PushDown(int rt) { 42 if (T[rt].val >= 0) { 43 T[rt<<1].val = T[rt<<1|1].val = T[rt].val; 44 T[rt<<1].mx = T[rt<<1|1].mx = T[rt].mx; 45 } 46 } 47 48 void build(int l, int r, int rt) { 49 if (l == r) { 50 scanf("%d", &T[rt].val); 51 T[rt].mx = T[rt].val; 52 return ; 53 } 54 int mid = (l+r)>>1; 55 build(lson); 56 build(rson); 57 PushUp(rt); 58 } 59 60 void update1(int ll, int rr, int l, int r, int rt) { 61 if (ll<=l && rr>=r) { 62 T[rt].val = x; 63 T[rt].mx = x; 64 return ; 65 } 66 int mid = (l+r)>>1; 67 PushDown(rt); 68 if (rr <= mid) { 69 update1(ll, rr, lson); 70 } else if (ll > mid) { 71 update1(ll, rr, rson); 72 } else { 73 update1(ll, mid, lson); 74 update1(mid+1, rr, rson); 75 } 76 PushUp(rt); 77 } 78 79 void update2(int ll, int rr, int l, int r, int rt) { 80 if (T[rt].mx <= x) 81 return ; 82 int mid = (l+r)>>1; 83 if (ll<=l && rr>=r) { 84 if (T[rt].val >= 0) { 85 T[rt].val = gcd(T[rt].val, x); 86 T[rt].mx = T[rt].val; 87 } else { 88 update2(ll, rr, lson); 89 update2(ll, rr, rson); 90 PushUp(rt); 91 } 92 return ; 93 } 94 PushDown(rt); 95 if (rr <= mid) { 96 update2(ll, rr, lson); 97 } else if (ll > mid) { 98 update2(ll, rr, rson); 99 } else { 100 update2(ll, mid, lson); 101 update2(mid+1, rr, rson); 102 } 103 PushUp(rt); 104 } 105 106 void printAll(int l, int r, int rt) { 107 if (T[rt].val >= 0) { 108 for (int i=l; i<=r; ++i) 109 printf("%d ", T[rt].val); 110 return ; 111 } 112 int mid = (l+r)>>1; 113 printAll(lson); 114 printAll(rson); 115 } 116 117 int main() { 118 int i, j, k; 119 int l, r; 120 int t; 121 122 #ifndef ONLINE_JUDGE 123 freopen("data.in", "r", stdin); 124 freopen("data.out", "w", stdout); 125 #endif 126 127 scanf("%d", &t); 128 while (t--) { 129 scanf("%d", &n); 130 build(1, n, 1); 131 scanf("%d", &m); 132 while (m--) { 133 scanf("%d %d %d %d", &k, &l, &r, &x); 134 if (k == 1) { 135 update1(l, r, 1, n, 1); 136 } else { 137 update2(l, r, 1, n, 1); 138 } 139 } 140 printAll(1, n, 1); 141 putchar(‘\n‘); 142 } 143 144 return 0; 145 }
时间: 2024-11-05 13:32:08