博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2777
阅读量:7223 次
发布时间:2019-06-29

本文共 2881 字,大约阅读时间需要 9 分钟。

题意

给定一个区间长度为l,共有t种颜色,o个操作。

C a b x 表示把a到b染成第x种颜色,P a b 表示查询a b间共有几种颜色。
初始状态下所有颜色为1,我就是因为这一点WA了几次


题解

t最大才30,颜色直接二进制压缩即可,不要每次修改a b间所有的点,lazy一下就好了


常数巨大的丑陋代码

# include 
# include
# include
# include
# include
using namespace std;# define IL inline# define RG register# define UN unsigned# define ll long long# define rep(i, a, b) for(RG int i = a; i <= b; i++)# define per(i, a, b) for(RG int i = b; i >= a; i--)# define mem(a, b) memset(a, b, sizeof(a))# define max(a, b) ((a) > (b)) ? (a) : (b)# define min(a, b) ((a) < (b)) ? (a) : (b)# define Swap(a, b) a ^= b, b ^= a, a ^= b;IL int Get(){ RG char c = '!'; RG int x = 0, z = 1; while(c != '-' && (c < '0' || c > '9')) c = getchar(); if(c == '-') z = -1, c = getchar(); while(c >= '0' && c <= '9') x=x*10+c-'0', c = getchar(); return x*z;}const int MAXM = 2000001;struct Tree{ int l, r, cover, color;} tree[MAXM];//color状压颜色 IL void Updata(RG int now){ tree[now].color = tree[now<<1].color|tree[now<<1|1].color;}IL void Pushdown(RG int now){ if(!tree[now].cover) return; tree[now<<1|1].cover = tree[now<<1].cover = 1; tree[now<<1|1].color = tree[now<<1].color = tree[now].color; tree[now].cover = 0;}IL void Build(RG int now, RG int l, RG int r){ tree[now] = (Tree) {l, r, 1, 1}; if(l == r) return; RG int mid = l+r>>1; Build(now<<1, l, mid); Build(now<<1|1, mid+1, r); Updata(now);}IL int Query(RG int now, RG int l, RG int r){ if(tree[now].cover || (tree[now].l == l && tree[now].r == r)) return tree[now].color; Pushdown(now); RG int mid = tree[now].l+tree[now].r>>1, t = 0; if(mid < l) t = Query(now<<1|1, l, r); if(mid >= l && mid < r) t = Query(now<<1, l, mid)|Query(now<<1|1, mid+1, r); if(mid >= r) t = Query(now<<1, l, r); Updata(now); return t;}IL void Add(RG int now, RG int l, RG int r, RG int x){ if(tree[now].l == l && tree[now].r == r){ tree[now].cover = 1; tree[now].color = x; return; } if(tree[now].color == x) return; Pushdown(now); RG int mid = tree[now].l+tree[now].r>>1; if(mid < l) Add(now<<1|1, l, r, x); if(mid >= l && mid < r) Add(now<<1, l, mid, x), Add(now<<1|1, mid+1, r, x); if(mid >= r) Add(now<<1, l, r, x); Updata(now);}int main(){ RG int l = Get(), t = Get(), o = Get(); Build(1, 1, l); rep(i, 1, o){ char c; scanf(" %c", &c); if(c == 'C'){ RG int a = Get(), b = Get(), x = Get(); Add(1, a, b, 1<<(x-1)); } else if(c == 'P'){ RG int a = Get(), b = Get(); RG int t = Query(1, a, b), ans = 0; while(t){ ans++; t -= (t&-t); } printf("%d\n", ans); } } return 0;}

转载于:https://www.cnblogs.com/cjoieryl/p/8206412.html

你可能感兴趣的文章
linux dd 读取 写入磁盘速度
查看>>
dmidecode查看linux硬件信息
查看>>
linux监控对象及重要性
查看>>
walle-web自动化部署配置
查看>>
opencv轮廓提取、轮廓识别相关要点
查看>>
BOOST.ASIO源码剖析(一)
查看>>
过滤squidlog中各个链接的大小
查看>>
我的友情链接
查看>>
使用AnyChat如何实现任意两用户之间的音视频交互
查看>>
【个人小结】项目公共js的配置,解决不同页面多个配置修改的问题
查看>>
XAMP安装Apacher无法启动
查看>>
mongodb user
查看>>
ip地址子网划分
查看>>
Linux下快速搭建ntp时间同步服务器
查看>>
TouchEvent的传递过程学习笔记
查看>>
Android笔记--TCP Scoket(字符串收发)
查看>>
我的友情链接
查看>>
Hunt framework 2.0.0 发布,简单且高性能的 Web 服务框架
查看>>
数据库原理及应用(SQL Server 2016数据处理)【上海精品视频课程】
查看>>
MaxCompute表设计最佳实践
查看>>