Description
There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can’t refuse any request from the devil. Also, this devil is looking like a very cute Loli.Input
The first line contains an integer T, denoting the number of the test cases.Output
For each test case, output a line with n integers separated by a single space representing the final sequence.Sample Input
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
Sample Output
16807 937186357 937186357 937186357 937186357 1 1 1624379149 1624379149 1624379149
題意:1操作代表改區間為x,2操作代表對於區間如果這個數>x的話就改成兩個數的gcd
思路:線段樹區間修改,隊友給的思路,多一個flag代表的是這個區間的數是否都是一樣的
#include#include #include #include #include #define lson(x) ((x) << 1) #define rson(x) ((x) << 1 | 1) typedef long long ll; using namespace std; const int MAXN = 100005; const int ROOT = 1; int gcd(int a,int b) { return b?gcd(b,a%b):a; } struct seg { int w; int v; int flag; }; struct segment_tree { seg node[MAXN << 2]; void update(int pos) { node[pos].flag = (node[lson(pos)].flag && node[rson(pos)].flag && node[lson(pos)].w == node[rson(pos)].w); node[pos].w = node[lson(pos)].w; } void build(int l, int r, int pos) { node[pos].flag = 0; node[pos].v = -1; if (l == r) { scanf("%d", &node[pos].w); node[pos].flag = 1; return; } int m = l + r >> 1; build(l, m, lson(pos)); build(m + 1, r, rson(pos)); update(pos); } void push(int l, int r, int pos) { if (node[pos].v != -1) { node[lson(pos)].v = node[rson(pos)].v = node[pos].v; node[lson(pos)].w = node[rson(pos)].w = node[pos].v; node[pos].v = -1;; } } void modify(int l, int r, int pos, int x, int y, int z) { if (x <= l && r <= y) { node[pos].w = z; node[pos].v = z;; /* node[pos].flag = z; is wrong. */ return; } push(l, r, pos); int m = l + r >> 1; if (x <= m) modify(l, m, lson(pos), x, y, z); if (y > m) modify(m + 1, r, rson(pos), x, y, z); update(pos); } void modify1(int l, int r, int pos, int x, int y, int z) { if (node[pos].flag && node[pos].w <= z) return; if (x <= l && y >= r && node[pos].flag) { node[pos].w = gcd(node[pos].w, z); node[pos].v = node[pos].w; return; } push(l, r, pos); int m = l + r >> 1; if (x <= m) modify1(l, m, lson(pos), x, y, z); if (y > m) modify1(m + 1, r, rson(pos), x, y, z); update(pos); } int query(int l, int r, int pos, int x, int y) { if (x <= l && r <= y) return node[pos].w; push(l, r, pos); int m = l + r >> 1; int res = 0; if (x <= m) res += query(l, m, lson(pos), x, y); if (y > m) res += query(m + 1, r, rson(pos), x, y); return res; } } tree; int main() { int t, n, m; scanf("%d", &t); while (t--) { scanf("%d", &n); tree.build(1, n, 1); scanf("%d", &m); int op, l, r, x; while (m--) { scanf("%d%d%d%d", &op, &l, &r, &x); if (op == 1) tree.modify(1, n, 1, l, r, x); else tree.modify1(1, n, 1, l, r, x); } for (int i = 1; i <= n; i++) printf("%d ", tree.query(1, n, 1, i, i)); printf("\n"); } return 0; }