poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777
题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总数
很明显的区间线段树,然后加lazy思想记录
lazy操作为了避免查找到每一个子节点区间而费时,将查找到的区间作标记,但查找到这个区间或还要继续像下查找的时候
将此区间的数据传给下面两个区间树
因为这题颜色总类只有30种很少,所以偷了个懒,将判断与记录操作合并到一个结构体上了,然后用类似hash的数组记录颜色总数
code
#include<cstdio>
#include<string.h>
using namespace std;
struct point
{
int l,r;
int color;
};
point tree[*];
int visit[];
void build(int i,int left,int right)
{
tree[i].l=left;tree[i].r=right;
tree[i].color=;
if(left==right)return;
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
}
void update(int i,int left,int right,int val)
{
if (left<=tree[i].l&&tree[i].r<=right){tree[i].color=val;return ;}
if (tree[i].color!=-) //lazy操作
{
tree[i*].color=tree[i*+].color=tree[i].color;
tree[i].color=-;
}
if (left<=tree[i*].r) update(i*,left,right,val);
if (right>=tree[i*+].l) update(i*+,left,right,val);
}
void find(int i,int left,int right)
{
if (tree[i].color!=-) {visit[tree[i].color]=;return ;}
if (tree[i].l==tree[i].r) return;
if (tree[i].color!=-)
{
tree[i*].color=tree[i*+].color=tree[i].color;
tree[i].color=-;
}
if (left<=tree[i*].r) find(i*,left,right);
if (right>=tree[i*+].l) find(i*+,left,right);
}
int main()
{
int x,y,z,n,m,k;
char op;
while (~scanf("%d %d %d",&x,&y,&z))
{
build(,,x);
while (z--)
{
scanf(" %c",&op);
if (op=='C')
{
scanf("%d %d %d",&n,&m,&k);
update(,n,m,k);
}
else
{
scanf("%d %d",&n,&m);
memset(visit,,sizeof(visit));
find(,n,m);
int sum=;
for (int i=;i<=;i++)
if (visit[i]==)
sum++;
printf("%d\n",sum);
}
}
}
return ;
}
poj 2777(线段树+lazy思想) 小小粉刷匠的更多相关文章
- POJ 2777——线段树Lazy的重要性
		
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
 - poj 3468(线段树+lazy思想)
		
题目链接:http://poj.org/problem?id=3468 思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个 ...
 - POJ 2777(线段树)
		
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
 - POJ 2777 线段树基础题
		
题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...
 - poj 2777线段树应用
		
敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...
 - Count Color POJ - 2777 线段树
		
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...
 - POJ  3225  线段树+lazy标记
		
lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...
 - poj  2777  线段树的区间更新
		
Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
 - poj 2777 线段树 区间更新+位运算
		
题意:有一个长板子,分成多段,有两种操作,第一种是C给从a到b那段染一种颜色c,另一种是P询问a到b有多少种不同的颜色.Sample Input2 2 4 板长 颜色数目 询问数目C 1 1 2P ...
 
随机推荐
- eval解析字符串为JSON对象
			
对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次. 这种方式也适合以普通j ...
 - ubuntu上安装mysql的正确步骤
			
1.在Ubuntu software Center中下载mysql:[注:mysql下载下来后好像就安装上了] 2.使用命令检查mysql是否已安装上: 2.1 运行sudo netstat -tap ...
 - 学JS的心路历程Day28 - PixiJS -基础(二)
			
材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...
 - C++读取txt和保存到txt
			
哇,今天又重新用C++来写了一些代码发现自己竟然在类的使用和文件读取和保存上面特别头疼,于是,各种问度娘+各种翻看之前的代码.不禁感叹,自己的代码还是写的太少了,对这些一点都不熟悉.于是,今晚!一定! ...
 - vue pros 子组件接收父组件传递的值
			
1.子组件 ItemTemplate.vue <template> <div class="item"> <li v-for="pdata ...
 - 关于 uboot 的异常向量表
			
ldr r,address 表示将 address 地址中的内容存入 r0 中
 - webstocket  聊天
			
/** * 初始化socket **/ function initSocket(index_host){//端口号 if( !window.WebSocket ){ console.log(" ...
 - pandas 常用清洗数据(二)
			
1. df.head() Here we import pandas using the alias 'pd', then we read in our data. df.head - shows u ...
 - CentOS6编译安装php5.3
			
一.CentOS6编译安装php5.3 1.安装扩展 yum install -y openssl-devel traceroute libtool unzip gcc gcc-c++ autocon ...
 - @JsonInclude(JsonInclude.Include.NON_NULL) 加在对象上
			
@JsonInclude(JsonInclude.Include.NON_NULL) public class ViewWorkermessage implements Serializable { ...