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

#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. Markdonw基本语法学习

    Markdonw基本语法 二级标题 三级标题 ----ctrl+r 粗体 ctrl+b 斜体 ctr+i #include<stdio.h> void main() { printf(&q ...

  2. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  3. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

  4. 《Java大学教程》—第14章 抽象、继承和接口

    自测题:1.    解释抽象和抽象数据类型的概念.P333抽象的概念是仅仅关注对象可以完成什么工作,而不必担心如何完成工作的细节.类模板通常被称为抽象数据类型.因为这类数据暴露给用户的所有信息仅仅是方 ...

  5. 连接rabbitmq

    #消费者import pika # 连接服务器 credentials = pika.PlainCredentials('*****', '***') connection = pika.Blocki ...

  6. dicom学习文章

    https://blog.csdn.net/column/details/dicom.html https://blog.csdn.net/zssureqh/article/details/49231 ...

  7. Hive数据仓库工具安装

    一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...

  8. 《程序员的自我修养》读书笔记——系统调用、API

        系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...

  9. 关于Swift中的指针的那些事

    前言 在Objective-c的世界中,一切对象都是指针.它是一种运行时语言,具体指针的对象类型将会在运行时,由系统分配.这样虽然自由,但是却并不安全. Swift世界就不一样了,Swift的世界很安 ...

  10. Sqlite3并发读写注意事项

    最近项目中涉及到sqlite并发读写的问题,参考一些文档并结合自己的实践,对sqlite3并发问题总结了几点: sqlite3的锁及事务类型 sqlite3总共有三种事务类型:BEGIN [DEFER ...