HDU-5023 线段树染色问题+延时标记
题意
给我们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 线段树染色问题+延时标记相关推荐
- hdu 5023 线段树染色问题
题目链接 A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/1 ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...
- poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
[题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...
- 贴海报 (线段树染色-离散化
n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 虽然之前学过离散化,但用的时 ...
- hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...
- hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...
- hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...
最新文章
- cmd不是内部命令解决方法
- python是不是特别垃圾-Python 这语言真是混乱和原始
- Visual Studio的导入和导出设置
- 腾讯计费:助力游戏千亿级营收,覆盖180多个国家
- sql trim()函数去掉两头空格
- 敏捷开发总结(1)软件研发过程
- 在JavaScript中以日期/月/年格式获取当前日期
- 【174个】最全DICOM资料汇总[截止10.10.20][中国数字医疗论坛]
- Ubuntu18.04更改图片尺寸和格式
- shopnc2014年11版数据库字典
- 百度开源AI硬件开发平台BIE-AI-Box和BIE-AI-Board
- python pygame K按键说明
- 人工智能实践:Tensorflow笔记 Class 5:卷积神经网络
- MATLAB矩阵范数最小值
- LaTeX入门级教程
- Python合并两个列表的方法
- InstallShield 2008 And 脚本(十)
- ZXR10交换机命名规则
- 传统企业如何应对互联网挑战
- appzapper注册码
热门文章
- 在Windows XP下,安装VS 2010 Express For Windows Phone .
- 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解
- ad采样做按键开关_磐石按键测试机解决各种按键测试问题
- springboot多环境加载yml和logback配置
- Socket实现Android客户端与服务器的通信
- Android 取消返回键返回事件,返回桌面,再按一次退出程序,双击事件
- android.os.BinderProxy cannot be cast to
- mac 通过 homebrew 安装mongodb
- 腾讯地图 qq.map 设置鼠标样式
- 小程序 background-image背景图片设置的注意点