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

#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. Linux atop 监控系统状态

    atop是一个功能非常强大的linux服务器监控工具,它的数据采集主要包括:CPU.内存.磁盘.网络.进程等,并且内容非常的详细,特别是当那一部分存在压力它会以特殊的颜色进行展示,如果颜色是红色那么说 ...

  2. python 制作一对一聊天

    用到的参考资料 https://blog.csdn.net/jia666666/article/details/81624550 https://blog.csdn.net/jia666666/art ...

  3. CentOS6.5 安装并配置vsftpd

    一.获取root权限 su 输入root密码 二.检查是否安装 rpm -qa | grep vsftpd 如果安装,会显示安装版本号,没有就什么都不显示 三.若已安装过vsftpd,先卸载.卸载前, ...

  4. 数据挖掘---Matplotib的学习

    什么是matplotlib mat - matrix 矩阵                二维数据 - 二维图表            plot - 画图            lib - libra ...

  5. C# -- 随机数(Random)的使用

    使用随机数产生一组大乐透号码 1. C#代码 1 Console.WriteLine("===============大乐透===红色球==============="); Lis ...

  6. linux 软连接创建 压缩解压缩 linux的dns服务相关

    linux软连接创建 注意用绝对路径,语法如下 ln -s 目标文件绝对路径 软连接名字绝对路径 ln -s /小护士.txt /tmp/hs.txt 修改linux的PS1变量,命令提示符变量 PS ...

  7. 基于Django rest framework 和Vue实现简单的在线教育平台

      一.基于api前端显示课程详细信息 1.调整Course.vue模块 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...

  8. Nginx代理与负载均衡

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  9. UVA1646-Edge Case(递推+斐波那契数列)

    Problem UVA1646-Edge Case Time Limit: 3000 mSec Problem Description Input For each test case, you ge ...

  10. 根据JavaBean创建数据库的操作SQL

    根据JavaBean创建数据库的操作SQL import java.lang.reflect.Field; public class GenerateSQL { public static void ...