Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
30种颜色0.0 果断状态压缩,按位处理#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 100000000; typedef long long ll; struct node { int l; int r; int mid; ll sta; int visit; }; node sa[100000 * 4]; int ar[100000 * 4]; int N, M, n; void build(int root, int begin, int end); void update(int root, int b, int e, int val); void pushup(int root); void pushdown(int root); ll query(int root, int b, int e); int main() { int i, j, k, u, m, a, b, c; char s[5]; while (scanf("%d %d %d", &N, &n, &M) != EOF) { build(1, 1, N); for (u = 1; u <= M; u++) { scanf("%s%d%d", s, &a, &b); int temp; if (a > b) { temp = a; a = b; b = temp; } if (strcmp(s, "C") == 0) { scanf("%d", &c); update(1, a, b, c); } else { ll res = query(1, a, b); int num = 0; while (res) { if (res & 1) num++; res >>= 1; } printf("%d\n", num); } } } return 0; } void build(int root, int begin, int end) { sa[root].l = begin; sa[root].r = end; sa[root].mid = (begin + end) / 2; sa[root].visit = 0; if (begin == end) { sa[root].sta = 1; } else { build(root * 2, sa[root].l, sa[root].mid); build(root * 2 + 1, sa[root].mid + 1, sa[root].r); pushup(root); } } void pushup(int root) { sa[root].sta = sa[root * 2].sta | sa[root * 2 + 1].sta; } void update(int root, int b, int e, int val) { if (sa[root].l > e || sa[root].r < b) return; if (sa[root].l >= b && sa[root].r <= e) { sa[root].sta = (ll)1 << (val-1); sa[root].visit += val; return; } pushdown(root); update(root * 2, b, e, val); update(root * 2 + 1, b, e, val); pushup(root); } void pushdown(int root) { if (sa[root].visit) { sa[root * 2].visit += sa[root].visit; sa[root * 2 + 1].visit += sa[root].visit; sa[root * 2].sta = sa[root].sta; sa[root * 2 + 1].sta = sa[root].sta; sa[root].visit = 0; } } ll query(int root, int b, int e) { if (sa[root].l > e || sa[root].r < b) return 0; if (sa[root].l >= b && sa[root].r <= e) return sa[root].sta; pushdown(root); return query(root * 2, b, e) | query(root * 2 + 1, b, e); } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator