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

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

题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总数

很明显的区间线段树,然后加lazy思想记录

lazy操作为了避免查找到每一个子节点区间而费时,将查找到的区间作标记,但查找到这个区间或还要继续像下查找的时候

将此区间的数据传给下面两个区间树

因为这题颜色总类只有30种很少,所以偷了个懒,将判断与记录操作合并到一个结构体上了,然后用类似hash的数组记录颜色总数

code

 1 #include<cstdio>
 2 #include<string.h>
 3 using namespace std;
 4 struct point
 5 {
 6     int l,r;
 7     int color;
 8 };
 9 point tree[100000*4];
10 int visit[31];
11 void build(int i,int left,int right)
12 {
13     tree[i].l=left;tree[i].r=right;
14     tree[i].color=1;
15     if(left==right)return;
16     int mid=(left+right)/2;
17     build(i*2,left,mid);
18     build(i*2+1,mid+1,right);
19 }
20 void update(int i,int left,int right,int val)
21 {
22     if (left<=tree[i].l&&tree[i].r<=right){tree[i].color=val;return ;}
23     if (tree[i].color!=-1) //lazy操作
24     {
25         tree[i*2].color=tree[i*2+1].color=tree[i].color;
26         tree[i].color=-1;
27     }
28     if (left<=tree[i*2].r) update(i*2,left,right,val);
29     if (right>=tree[i*2+1].l) update(i*2+1,left,right,val);
30 }
31 void find(int i,int left,int right)
32 {
33     if (tree[i].color!=-1) {visit[tree[i].color]=1;return ;}
34     if (tree[i].l==tree[i].r) return;
35     if (tree[i].color!=-1)
36     {
37         tree[i*2].color=tree[i*2+1].color=tree[i].color;
38         tree[i].color=-1;
39     }
40     if (left<=tree[i*2].r) find(i*2,left,right);
41     if (right>=tree[i*2+1].l) find(i*2+1,left,right);
42 }
43 int main()
44 {
45     int x,y,z,n,m,k;
46     char op;
47     while (~scanf("%d %d %d",&x,&y,&z))
48     {
49         build(1,1,x);
50         while (z--)
51         {
52             scanf(" %c",&op);
53             if (op==‘C‘)
54             {
55                 scanf("%d %d %d",&n,&m,&k);
56                 update(1,n,m,k);
57             }
58             else
59             {
60                 scanf("%d %d",&n,&m);
61                 memset(visit,0,sizeof(visit));
62                 find(1,n,m);
63                 int sum=0;
64                 for (int i=1;i<=30;i++)
65                     if (visit[i]==1)
66                        sum++;
67                 printf("%d\n",sum);
68             }
69         }
70     }
71     return 0;
72 }
时间: 2024-11-05 02:40:46

poj 2777(线段树+lazy思想) 小小粉刷匠的相关文章

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 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

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 BitC

poj(2777)——Count Color(lazy思想,成段更新,区间统计)

题目的意思是: 现在我们有l个数,然后标记为1到n,他们的单位长度都是1,然后在每个单位长度的地方我们只能染上一种颜色. 现在有两种操作: "C A B C"代表给A,B区间都染上C这种颜色. "P A B" 相当于是询问,需要输出A,B这个区间不同颜色的数量是多少. 一开始我在想要怎么求不同颜色的数量,后来发现题目中说颜色的范围是30种颜色,所以在这里我们就可以进行暴力枚举了. 这个染色问题我一开始没怎么懂,后来在纸上模拟了一下别人的代码,然后就理解了. 首先如果

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

线段树lazy标记??Hdu4902

Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 335    Accepted Submission(s): 159 Problem Description There is an old country and the king fell in love with a devil. The devil al

fzu 2171 线段树 lazy标记

http://acm.fzu.edu.cn/problem.php?pid=2171      Problem 2171 防守阵地 II Accept: 73    Submit: 256Time Limit: 3000 mSec    Memory Limit : 32768 KB Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵

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

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