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 }
时间: 2024-10-14 16:21:36

POJ 2777 线段树的相关文章

poj 2777 线段树的区间更新

Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Chosen Problem Solving and Program design as an optional course, you are required to solve al

poj 2777(线段树+lazy思想) 小小粉刷匠

http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总数 很明显的区间线段树,然后加lazy思想记录 lazy操作为了避免查找到每一个子节点区间而费时,将查找到的区间作标记,但查找到这个区间或还要继续像下查找的时候 将此区间的数据传给下面两个区间树 因为这题颜色总类只有30种很少,所以偷了个懒,将判断与记录操作合并到一个结构体上了,然后用类似hash的

poj 2777线段树应用

敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.... 貌似这个题用了很经典的线段树和位运算.懂了.但不是很懂.确实觉得用的很巧妙.只想说.好坑. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #de

POJ 2528 (线段树+离散化) Mayor&#39;s posters

因为将每个单位都作为一个最小单元的话会爆内存的 所以,将海报的每个端点进行排序,将这些端点最为最小的区间. 毕竟是刚刚接触线段树,理解起来还有些吃力,还是那句话,题做多了慢慢就好了. 萌萌的AC代码君贴上. 1 //#define LOCAL 2 #include <iostream> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 7 int n; 8 struct CPost 9

转载::POJ 2991 线段树+计算几何(有c++结构体操作)

POJ 2991 线段树+计算几何 (2011-02-27 21:13:44) 转载▼ 标签: 杂谈 分类: OI 话说这一题真的是很恶心很恶心,不过确实改变了我对线段树的一些看法,算是很经典的题目. 题意:有一个吊车由很多个不同长度的线段组成,一开始是一条长直线起点在(0,0),尾节点在(0,sum[n]),每条线段之间的夹角的初始值是180度.然后有一些操作a. b将第a条线段和a+1之间的夹角变成b度,经过每一次操作都要求出尾节点的坐标. 首先要用到一个计算几何的知识(没学过..请教而来)

poj 2750(线段树的动态规划)

Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4186   Accepted: 1581 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of f

POJ 2570 线段树

Potted Flower Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description The little cat takes over the management of a new park. There is a large circular statue in

poj 2828 线段树

http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 并且后来的也可以确定----如果从前往后,所有的随时都不是确定的 2.线段树叶子节点直接维护区间(线段)信息,非叶子节点v维护的是以v为树根的整个子树的信息,那么假设父节点rt信息为[l,r]那么左子树维护[l,mid],右子树维护[mid+1,r]的信息.如果如果是前缀和,rt里是1-n的和,左子树1~n/2的和,右子树是n/2+1~n

POJ 3468 线段树+lazy标记

lazy标记 Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to