POJ 2777 线段树

Posted Flowersea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2777 线段树相关的知识,希望对你有一定的参考价值。

链接:

http://poj.org/problem?id=2777

题意:

有L个气球,开始颜色为1,每次给l,r之间的气球染色x,然后询问l,r区间有多少种不同的颜色

题解:

因为颜色最多有30种,所以对这30中颜色状态压缩一下,放在线段树里面,这样就容易更新了

最后只要计算一下query返回值得数有多少个1就行了

代码:

 31 int L, T, O;
 32 int Tree[MAXN << 2];
 33 int Lazy[MAXN << 2];
 34 
 35 int BitCount(int n) {
 36     int c = 0;
 37     for (c = 0; n; ++c) n &= (n - 1);
 38     return c;
 39 }
 40 
 41 void pushup(int rt) {
 42     Tree[rt] = Tree[rt << 1] | Tree[rt << 1 | 1];
 43 }
 44 
 45 void pushdown(int rt) {
 46     if (Lazy[rt]) {
 47         Tree[rt << 1] = Lazy[rt];
 48         Tree[rt << 1 | 1] = Lazy[rt];
 49         Lazy[rt << 1] = Lazy[rt];
 50         Lazy[rt << 1 | 1] = Lazy[rt];
 51         Lazy[rt] = 0;
 52     }
 53 }
 54 
 55 void build(int l,int r,int rt) {
 56     if (l == r) {
 57         Tree[rt] = 1;
 58         return;
 59     }
 60     int m = (l + r) >> 1;
 61     build(lson);
 62     build(rson);
 63     pushup(rt);
 64 }
 65 
 66 void update(int L, int R, int x, int l, int r, int rt) {
 67     if (L <= l && r <= R) {
 68         Tree[rt] = (1 << x);
 69         Lazy[rt] = (1 << x);
 70         return;
 71     }
 72     pushdown(rt);
 73     int m = (l + r) >> 1;
 74     if (L <= m) update(L, R, x, lson);
 75     if (R > m) update(L, R, x, rson);
 76     pushup(rt);
 77 }
 78 
 79 int query(int L, int R, int l, int r, int rt) {
 80     if (L <= l && r <= R) return Tree[rt];
 81     pushdown(rt);
 82     int m = (l + r) >> 1;
 83     int ret = 0;
 84     if (L <= m) ret |= query(L, R, lson);
 85     if (R > m) ret |= query(L, R, rson);
 86     return ret;
 87 }
 88 
 89 int main() {
 90     ios::sync_with_stdio(false), cin.tie(0);
 91     cin >> L >> T >> O;
 92     build(1, L, 1);
 93     while(O--) {
 94         char c;
 95         cin >> c;
 96         if (c == C) {
 97             int a, b, x;
 98             cin >> a >> b >> x;
 99             if (a > b) swap(a, b);
100             update(a, b, x - 1, 1, L, 1);
101         }
102         else {
103             int a, b;
104             cin >> a >> b;
105             if (a > b) swap(a, b);
106             cout << BitCount(query(a, b, 1, L, 1)) << endl;
107         }
108     }
109     return 0;
110 }

 

以上是关于POJ 2777 线段树的主要内容,如果未能解决你的问题,请参考以下文章

poj-2777线段树刷题

POJ2777-Count Color 线段树

poj 2777 count color 线段树

POJ2777 Count Color线段树

POJ 2777 Count Color (线段树 + 状态压缩)

POJ P2777 Count Color——线段树状态压缩