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思想) 小小粉刷匠的更多相关文章

  1. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  2. poj 3468(线段树+lazy思想)

    题目链接:http://poj.org/problem?id=3468 思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个 ...

  3. POJ 2777(线段树)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42507   Accepted: 12856 Des ...

  4. POJ 2777 线段树基础题

    题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...

  5. poj 2777线段树应用

    敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...

  6. Count Color POJ - 2777 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  7. POJ 3225 线段树+lazy标记

    lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...

  8. poj 2777 线段树的区间更新

    Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...

  9. poj 2777 线段树 区间更新+位运算

    题意:有一个长板子,分成多段,有两种操作,第一种是C给从a到b那段染一种颜色c,另一种是P询问a到b有多少种不同的颜色.Sample Input2 2 4  板长 颜色数目 询问数目C 1 1 2P ...

随机推荐

  1. spring boot 集成Thymeleaf

                                           

  2. spring boot 的热部署插件

  3. 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.

    先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...

  4. Dapper使用总结

  5. Kotlin系列之序列(Sequences)源码完全解析

    Kotlin系列之序列(Sequences)源码完全解析 2018年06月05日 22:04:50 mikyou 阅读数:179 标签: Kotlin序列(sequence)源码解析Androidja ...

  6. 一些常见的js问题总结

  7. 论Ubuntu下的docker多难搭建

    慷慨一下: 上周四开始打算在Ubuntu系统下面熟悉操作一下docker,所以深知在本地的虚拟机上搭建一个docker非常的easy. 但是,要下载一个镜像,真是太难了.基本可以说是下载不了的.于是乎 ...

  8. MySql数据库常用语句汇总

    第一天1.登陆数据库 mysql -uroot -proot; //-u用户名 -p密码2.启动数据库 net start mysql;3.创建表空间(数据库)create database qy97 ...

  9. Compute Shader

    [Compute Shader] 1.Similar to regular shaders, compute shaders are Asset files in your project, with ...

  10. python -- 初始函数 函数的定义,函数的返回值以及函数的参数

    1.什么是函数,函数的定义及语法 2.函数的返回值 3.函数的参数 一.函数的定义及语法 函数的定义:定义了一个动作或者功能,是对功能的封装 语法: def 函数名( 形参列表 ):          ...