题意

给我们1-n的区间段 两种操作
P a b c 表示把a到b染成c颜色
Q a b 表示求a到b的颜色种类数量
注意初始全部先染成颜色2

分析

线段树经典染色问题
可以用二进制来表示颜色数量 一共30个颜色 那么最多也就是30位 不会超过int的范围 二进制下第x位为1表示有x+1的颜色
父节点可以用”|”运算来统计两个子节点的信息

CODE

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int maxn = 1000010;
struct tree{int color,tag;//延时标记
}T[maxn<<2];
void build(int l,int r,int rt)
{T[rt].tag=0;//注意这里要初始化树中的每个点都要初始化成0 才不会出错if(l==r){T[rt].color=2;return;}int mid = (l+r)>>1;build(lson);build(rson);T[rt].color = T[rt<<1].color | T[rt<<1|1].color;
}
void push_down(int l,int r,int rt){if(T[rt].tag){T[rt<<1].color = T[rt<<1|1].color = T[rt].tag;T[rt<<1].tag = T[rt<<1|1].tag = T[rt].tag;T[rt].tag=0;}
}
void update(int s,int e,int cor,int l,int r,int rt){if(s<=l&&e>=r){T[rt].color = 1<<(cor-1);T[rt].tag = 1<<(cor-1);return;}push_down(l,r,rt);int mid = (l+r)>>1;if(s<=mid)update(s,e,cor,lson);if(e>=mid+1)update(s,e,cor,rson);T[rt].color = T[rt<<1].color|T[rt<<1|1].color;
}
int query(int s,int e,int l,int r,int rt){if(s<=l&&e>=r)return T[rt].color;push_down(l,r,rt);int mid = l+r>>1;int ans=0;if(s<=mid)ans|=query(s,e,lson);if(e>=mid+1)ans|=query(s,e,rson);return ans;
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)){if(n==0&&m==0)return 0;char cc[3];build(1,n,1);while(m--){int a,b,c;scanf(" %s",cc);if(cc[0]=='P'){scanf("%d%d%d",&a,&b,&c);update(a,b,c,1,n,1);}else{scanf("%d%d",&a,&b);int ans = query(a,b,1,n,1);bool f=0;while(ans){if(ans&1){if(f)printf(" %d",cnt);else printf("%d",cnt),f=1;}cnt++;ans>>=1;}puts("");}}}return 0;
}

HDU-5023 线段树染色问题+延时标记相关推荐

  1. hdu 5023 线段树染色问题

    题目链接 A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/1 ...

  2. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  3. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  4. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  5. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

  6. 贴海报 (线段树染色-离散化

    n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 虽然之前学过离散化,但用的时 ...

  7. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  8. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  9. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

最新文章

  1. cmd不是内部命令解决方法
  2. python是不是特别垃圾-Python 这语言真是混乱和原始
  3. Visual Studio的导入和导出设置
  4. 腾讯计费:助力游戏千亿级营收,覆盖180多个国家
  5. sql trim()函数去掉两头空格
  6. 敏捷开发总结(1)软件研发过程
  7. 在JavaScript中以日期/月/年格式获取当前日期
  8. 【174个】最全DICOM资料汇总[截止10.10.20][中国数字医疗论坛]
  9. Ubuntu18.04更改图片尺寸和格式
  10. shopnc2014年11版数据库字典
  11. 百度开源AI硬件开发平台BIE-AI-Box和BIE-AI-Board
  12. python pygame K按键说明
  13. 人工智能实践:Tensorflow笔记 Class 5:卷积神经网络
  14. MATLAB矩阵范数最小值
  15. LaTeX入门级教程
  16. Python合并两个列表的方法
  17. InstallShield 2008 And 脚本(十)
  18. ZXR10交换机命名规则
  19. 传统企业如何应对互联网挑战
  20. appzapper注册码

热门文章

  1. 在Windows XP下,安装VS 2010 Express For Windows Phone .
  2. 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解
  3. ad采样做按键开关_磐石按键测试机解决各种按键测试问题
  4. springboot多环境加载yml和logback配置
  5. Socket实现Android客户端与服务器的通信
  6. Android 取消返回键返回事件,返回桌面,再按一次退出程序,双击事件
  7. android.os.BinderProxy cannot be cast to
  8. mac 通过 homebrew 安装mongodb
  9. 腾讯地图 qq.map 设置鼠标样式
  10. 小程序 background-image背景图片设置的注意点