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

#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. chmod命令-权限

    ---··[转] hmod命令:改变文件权限.         一:符号模式:     命令格式:chmod [who] operator [permission] filename who包含的选项 ...

  2. XSS攻击介绍

    一.概念 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞, ...

  3. C#-简介(一)

    1.C#语言简介 C#计算机语言 是一门高级计算机语言 他的开发模式更接近人类和社会的思维模式,有助于提高开发效率 C#历史 1998年COOL这个项目是C#语言的前身,由微软 Anders Hejl ...

  4. SQL Server 锁实验(重建索引)

    昨晚某现场报一个重建索引失败的问题,远程查看后发现是自动收缩的内部会话引发的锁申请超时,突然想起来自己的加锁实验还没完成索引重建部分,今天有空正好做一下: USE [数据库名] GO ALTER IN ...

  5. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...

  6. js获取当前页面url网址信息

    js如何准确获取当前页面url网址信息 在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个 ...

  7. 【算法】LeetCode算法题-Longest Common Prefix

    这是悦乐书的第146次更新,第148篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第5题(顺位题号是14),给定一个随机的字符串数组,查找这些字符串元素的公共前缀字符串, ...

  8. servlet温习

    servlet是Javaweb的核心,它实质上就是运行在服务器端的Java代码 1.简介 servlet是运行在服务器端的小程序,是sun公司提供的一套规范(接口),用来处理用户的请求,响应给浏览器的 ...

  9. DBUtils温习1

    1.简介 Commons DBUtIls是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,但是使用DBUtils却极大的简化了dao层的开发,少些了很多的jdb ...

  10. 17.基于scrapy-redis两种形式的分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...