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

#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. web前端(6)—— 标签的属性,分类,嵌套

    属性 HTML标签可以设置属性,属性一般以键值对的方式写在开始标签中 1.HTML标签除一些特定属性外可以设置自定义属性,一个标签可以设置多个属性用空格分隔,多个属性不区分先后顺序. 2.属性值要用引 ...

  2. Vue修改、编辑时,撤销修改内容,表格内容不变

    在编辑该行的过程中,突然不想编辑了,想点击撤销按钮,将该行数据恢复到旧值,目前的做法是,在点击编辑按钮的时候转换成json字符,点击撤销按钮的时候再解析成对象,赋值给该行的数据. // 编辑editH ...

  3. 冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)

    LOWB 三人组 分清有序区跟无序区 冒泡排序 思路: 首先,列表每两个相邻的数,如果前边的比后边的大,那么交换和两个数.... 冒泡排序优化 如果一趟没有发生任何交换 那么证明列表已经是有序的了 i ...

  4. vi/vim tab键空格数修改

    更改Tap键单位 vi/vim编辑器默认情况下,每按一次Tap相对于8个空格. (1)临时性更改 使用vi打开文件后,输入如下命令: :set tabstop=4 命令释义:更改为相当于四个空格. ( ...

  5. [matlab] 17.网格矩阵

    生成网格矩阵,并且根据条件筛选,重新赋值为0,1二值图像 clear all;close all; %生成二值图 index= randperm(2500,1000); %生成10个不重复随机指标 Z ...

  6. [TJOI2017]DNA

    嘟嘟嘟 这题怎么想都想不出来,最后还是敲了暴力,喜提40分-- 正解竟然也是暴力-- 用\(s_0\)构造SAM,然后把\(s\)扔上去暴力dfs:记录一个修改次数tot,如果当前不匹配,就tot + ...

  7. centos7 开机启动服务链接说明

    环境:centos7 创建的开机启动的链接地址: /etc/systemd/system/multi-user.target.wants/ 如: [root@tiaobanji system]# ll ...

  8. SpringMVC @ResponseBody 406

    使用@ResponseBody注解可以让Controller返回json格式的数据,在需要传输一个对象信息的时候往往使用这种方式.如果在使用的时候遇到了406,一般原因是: 缺少jar包.转换成jso ...

  9. JSoup抓取本地页面

    File in = new File("C:/Users/li/Desktop/2.html"); Document doc01 = Jsoup.parse(in, "U ...

  10. Linux之RTOS学习

    Linux之RTOS学习 RTOS: Real time operating system 系统选型 可选方案 RTLinux - FSMLabs, WindRiver Systems - http: ...