标签:hdu5023
5 10 P 1 2 3 P 2 3 4 Q 2 3 Q 1 3 P 3 5 4 P 1 2 7 Q 1 3 Q 3 4 P 5 5 8 Q 1 5 0 0
4 3 4 4 7 4 4 7 8
#include <stdio.h> #include <algorithm> #include <string.h> #define maxn 100010 #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 using namespace std; struct Node { int num, col[62]; bool lazy; } T[maxn << 2]; int a[maxn], b[maxn], c[maxn], hash[maxn << 1]; bool ans[32]; char op[maxn]; void pushDown(int rt) { T[rt << 1].lazy = T[rt << 1 | 1].lazy = true; T[rt].lazy = false; T[rt << 1].col[0] = T[rt << 1 | 1].col[0] = T[rt].col[0]; T[rt << 1].num = T[rt << 1 | 1].num = 1; } void pushUp(int rt) { int count = 0, i; for(i = 0; i < T[rt << 1].num; ++i) T[rt].col[count++] = T[rt << 1].col[i]; for(i = 0; i < T[rt << 1 | 1].num; ++i) T[rt].col[count++] = T[rt << 1 | 1].col[i]; sort(T[rt].col, T[rt].col + count); T[rt].num = unique(T[rt].col, T[rt].col + count) - T[rt].col; } void build(int l, int r, int rt) { T[rt].lazy = false; T[rt].num = 1; T[rt].col[0] = 2; if(l == r) return; int mid = (l + r) >> 1; build(lson); build(rson); } void update(int L, int R, int val, int l, int r, int rt) { if(L == l && R == r) { T[rt].lazy = true; T[rt].num = 1; T[rt].col[0] = val; return; } if(T[rt].lazy) pushDown(rt); int mid = (l + r) >> 1; if(R <= mid) update(L, R, val, lson); else if(L > mid) update(L, R, val, rson); else { update(L, mid, val, lson); update(mid + 1, R, val, rson); } pushUp(rt); } void query(int L, int R, int l, int r, int rt) { if(L == l && R == r) { for(int i = 0; i < T[rt].num; ++i) ans[T[rt].col[i]] = true; return; } if(T[rt].lazy) pushDown(rt); int mid = (l + r) >> 1; if(R <= mid) query(L, R, lson); else if(L > mid) query(L, R, rson); else { query(L, mid, lson); query(mid + 1, R, rson); } } int main() { //freopen("stdin.txt", "r", stdin); int n, m, i, id, j; char ch[2]; while(scanf("%d%d", &n, &m) != EOF && (n || m)) { for(i = id = 0; i < m; ++i) { scanf("%s%d%d", ch, &a[i], &b[i]); hash[id++] = a[i]; hash[id++] = b[i]; if(ch[0] == 'P') scanf("%d", &c[i]); op[i] = ch[0]; } sort(hash, hash + id); id = unique(hash, hash + id) - hash; build(1, id, 1); for(i = 0; i < m; ++i) { a[i] = lower_bound(hash, hash + id, a[i]) - hash + 1; b[i] = lower_bound(hash, hash + id, b[i]) - hash + 1; if(op[i] == 'P') update(a[i], b[i], c[i], 1, id, 1); else { memset(ans, 0, sizeof(ans)); query(a[i], b[i], 1, id, 1); for(j = 0; j <= 30; ++j) if(ans[j]) { printf("%d", j); break; } for(++j; j <= 30; ++j) if(ans[j]) printf(" %d", j); printf("\n"); } } } return 0; }
#include <stdio.h> #include <string.h> #define maxn 1000002 #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 struct Node { int col; bool lazy; } T[maxn << 2]; void pushDown(int rt) { T[rt].lazy = false; T[rt << 1].lazy = T[rt << 1 | 1].lazy = true; T[rt << 1].col = T[rt << 1 | 1].col = T[rt].col; } void pushUp(int rt) { T[rt].col = T[rt << 1].col | T[rt << 1 | 1].col; } void build(int l, int r, int rt) { T[rt].col = 4; // 1 << 2; T[rt].lazy = false; if(l == r) return; int mid = (l + r) >> 1; build(lson); build(rson); } void update(int L, int R, int col, int l, int r, int rt) { if(L == l && R == r) { T[rt].lazy = true; T[rt].col = 1 << col; return; } if(T[rt].lazy) pushDown(rt); int mid = (l + r) >> 1; if(R <= mid) update(L, R, col, lson); else if(L > mid) update(L, R, col, rson); else { update(L, mid, col, lson); update(mid + 1, R, col, rson); } pushUp(rt); } int query(int L, int R, int l, int r, int rt) { if(L == l && R == r) { return T[rt].col; } if(T[rt].lazy) pushDown(rt); int mid = (l + r) >> 1, ans; if(R <= mid) ans = query(L, R, lson); else if(L > mid) ans = query(L, R, rson); else { ans = query(L, mid, lson) | query(mid + 1, R, rson); } return ans; } int main() { //freopen("stdin.txt", "r", stdin); int n, m, a, b, c, i, ans; char ch[2]; while(scanf("%d%d", &n, &m) != EOF && (n || m)) { build(1, n, 1); while(m--) { scanf("%s%d%d", ch, &a, &b); if(ch[0] == 'P') { scanf("%d", &c); update(a, b, c, 1, n, 1); } else { ans = query(a, b, 1, n, 1); for(i = 0; i <= 30; ++i) if((ans >> i) & 1) { printf("%d", i); break; } for(++i; i <= 30; ++i) if((ans >> i) & 1) printf(" %d", i); printf("\n"); } } } return 0; }
HDU5023 A Corrupt Mayor's Performance Art 【线段树】
标签:hdu5023
原文地址:http://blog.csdn.net/chang_mu/article/details/39479669