这个也是一个线段树的模板

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<set>
using namespace std;
const int maxx = ;
set<int>s;
struct node{
int color;
int left;
int right;
int mid;
}a[maxx<<];
void pushdown(int root){
if(a[root].color){//把修改到两个子节点,并重新把laze清空
a[root<<].color=a[root].color;
a[root<<|].color=a[root].color;
a[root].color=;
}
}
void buildtree(int root,int l,int r)
{
int mid=(l+r)>>;
a[root].left=l;
a[root].right=r;
a[root].mid=mid;
a[root].color=;
if(l==r)return;
buildtree(root*,l,mid);
buildtree(root*+,mid+,r);
}
void update(int root,int l,int r,int c){
if (a[root].left == l && a[root].right == r){
a[root].color=c;//满足延时标记所满足的区间
return;
}
if (a[root].color==c)return;
pushdown(root);//所更新的区间比较小,我们可以把修改push下去
if(l>a[root].mid)update(root<<|,l,r,c);//所求区间在现在的区间的右边,所以选择当前节点的右儿子
else if (r<=a[root].mid)update(root<<,l,r,c);//在左边,选择左儿子
else {//通过中间节点进行二分
update(root<<,l,a[root].mid,c);
update(root<<|,a[root].mid+,r,c);
}
}
void query(int root,int l,int r){
if (a[root].color){//当前的laze标记已经标记到这个位置
s.insert(a[root].color);
return;
}
//如果没有到这个位置代表需要往下找 同理
if (l > a[root].mid)query(root<<|,l,r);
else if (r<=a[root].mid)query(root<<,l,r);
else{
query(root<<,l,a[root].mid);
query(root<<|,a[root].mid+,r);
}
}
int main(){
int n,m;
int l,r,c;
char op[];
while(~scanf("%d%d",&n,&m) &&(n+m)){
buildtree(,,n);
for (int i=;i<m;i++){
scanf("%s%d%d",op,&l,&r);
if(op[]=='P'){
scanf("%d",&c);
update(,l,r,c);
}else{
s.clear();
query(,l,r);
int ss=s.size();
set<int>::iterator it;
for (it=s.begin();it!=s.end();it++){
printf("%d",*it);
if (ss>)printf(" ");
ss--;
}
printf("\n");
}
}
}
return ;
}

题,只需要添加laze标记,并且在不断的维护中,保存更新并pushdown下去,然后为了避免重复,搞一个set就行。

HDU 5023线段树区间染色,统计区间内颜色个数的更多相关文章

  1. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  2. HDU - 1754 线段树-单点修改+询问区间最大值

    这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...

  3. hdu 1754 线段树(单点替换 区间最值)

    Sample Input5 61 2 3 4 5Q 1 5 //1-5结点的最大值U 3 6 //将点3的数值换成6Q 3 4Q 4 5U 2 9Q 1 5 Sample Output5659 # i ...

  4. hdu 1166 线段树(单点增减 区间求和)

    Sample Input1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample Outp ...

  5. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  6. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  7. hdu 5023 线段树延迟更新+状态压缩

    /* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...

  8. hdu 5023 线段树

    成端更新+统计区间内的值 挺模板的题... 一开始没想起来用set统计,傻傻地去排序了[大雾 #include<iostream> #include<cstdio> #incl ...

  9. hdu 1754 线段树 单点更新 动态区间最大值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. 使用netstat命名排查网络问题的参考指引

    原文链接:http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=69b487d0-8bf4-4 ...

  2. MySql基本使用方法

    一,基本概念 1, 常用的两种引擎:         (1) InnoDB        a,支持ACID,简单地说就是支持事务完整性.一致性:         b,支持行锁,以及类似ORACLE的一 ...

  3. 好系统重装助手教你清理win7系统中DNS缓存

    在我们使用电脑的过程中,有时候一个经常用的网页突然打不开了,遇到这种情况,清理一下DNS缓存就可以解决了.如何清理DNS缓存?小编这就给大家说一种最简单的方法. 1.组合键:win+R,输入cmd,点 ...

  4. 数组实例的 copyWithin()

    用途:在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组.也就是说,使用这个方法,会修改数组本身. 用法:Array.prototype.copyWithin(targ ...

  5. LeetCode算法题-Power of Four(Java实现-六种解法)

    这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...

  6. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...

  7. Sublime 汉化、快捷键打开浏览器

    Sublime 是一个优秀的代码编译工具,它具有漂亮的用户界面和强大的功能,例如代码缩略图,Python 的插件,代码段等.不仅如此,它还可自定义按键绑定,菜单和工具栏.由于是歪果仁开发的,所以官方版 ...

  8. ES5-ES6-ES7_Promise对象详解

    Promise对象概述(什么是Promise) Promise 是异步编程的一种解决方案,比传统的异步解决方案——回调函数和事件——更合理和更强大 所谓Promise,简单说就是一个容器,里面保存着某 ...

  9. 日常训练 dfs 之 拓扑排序

    今天被拓扑排序给折磨了一天,主要就是我的一个代码有点小bug,真难找... 先来看看我今天写的题目吧! C. Fox And Names Fox Ciel is going to publish a ...

  10. I/O 机制的介绍(Linux 中直接 I/O 机制的介绍)

    IO连接的建立方式 1.缓存IO.流式IO: 2.映射IO.块式IO: 3.直接IO. IO的方式: 同步.异步.定时刷新: MMAP与内核空间 mmap使用共享用户空间与内核空间实现: 直接 I/O ...