Luogu P1558 色板游戏
(此题与POJ2777重题)
为了加深对线段树的记忆,然后开始搞这道题。
TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见)
这道题只需要在线段树的板子上改一些地方就可以了:
1.存储时不是存储颜色,而是将它状压成一个整数(如序号为3的颜色存为1<<3=8)
2.回溯时不是取和相加,而是直接按位或(|),原理等下讲
3.最后的查询完毕的值统计一下二进制下有多少个1就是ans
最后讲一下为什么要|
假如3种颜色 2,3,3,在树上记为4,8,8,它们对应的二进制就是(100,1000,1000)
有没有发现,每个数的二进制下都只有一位上有1,而且不同颜色的数1的位置不同
因此在|的时候,只要这一位上有1,那么就一定有这种颜色
线段树就是板子,套一套就好了
CODE
#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
int tree[N*],add[N*],l,t,o,x,y,z;
char ch;
inline void read(int &x)
{
x=; char ch=getchar(); int flag=;
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
inline void write(int x)
{
if (x/) write(x/);
putchar(x%+'');
}
inline void up(int root)
{
tree[root]=tree[root*]|tree[root*+];
}
inline void down(int root)
{
if (add[root])
{
tree[root*]=add[root];
tree[root*+]=add[root];
add[root*]=add[root];
add[root*+]=add[root];
add[root]=;
}
}
inline void build(int root,int l,int r)
{
if (l==r)
{
tree[root]=;
return;
}
int mid=l+r>>;
build(root*,l,mid);
build(root*+,mid+,r);
up(root);
}
inline void change(int root,int l,int r,int beg,int end,int col)
{
if (l>=beg&&r<=end)
{
tree[root]=<<col;
add[root]=<<col;
return;
}
down(root);
int mid=l+r>>;
if (beg<=mid) change(root*,l,mid,beg,end,col);
if (end>mid) change(root*+,mid+,r,beg,end,col);
up(root);
}
inline int query(int root,int l,int r,int beg,int end)
{
if (l>=beg&&r<=end) return tree[root];
down(root);
int mid=l+r>>,res=;
if (beg<=mid) res|=query(root*,l,mid,beg,end);
if (end>mid) res|=query(root*+,mid+,r,beg,end);
up(root);
return res;
}
inline int calc(int x)
{
int res=;
while (x)
{
if (x%==) res++;
x>>=;
}
return res;
}
int main()
{
read(l); read(t); read(o);
build(,,l);
while (o--)
{
cin>>ch;
if (ch=='C')
{
read(x); read(y); read(z);
if (x>y) swap(x,y);
change(,,l,x,y,z);
}else
{
read(x); read(y);
if (x>y) swap(x,y);
write(calc(query(,,l,x,y))); putchar('\n');
}
}
return ;
}
Luogu P1558 色板游戏的更多相关文章
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- luogu 1558 色板游戏
写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路..... 色板游戏 色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格.并从左到 ...
- 洛谷P1558 色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有 ...
- P1558 色板游戏 线段树+二进制状压
好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...
随机推荐
- Android Application中的Context和Activity中的Context的异同
一.Context是什么: 1.Context是维持Android程序中各组件能够正常工作的一个核心功能类,我们选中Context类 ,按下快捷键F4,右边就会出现一个Context类的继承结构图啦, ...
- (转载)令人迷糊的Oracle递归查询(start with)
转载地址:https://blog.csdn.net/weiwenhp/article/details/8218091 备注:如有侵权,请联系立即删除. 写代码时碰到要弄清楚Oracle的role之间 ...
- 解决JBoss只能通过localhost访问不能通过IP的问题
前序 现在EJB是真的有点落伍了么,网上找点资料都挺难的样子,而且都是很久的了..好吧,最近对EJB有点兴趣学习一下,结果下载到服务器启动后,居然不能直接通过服务器IP访问,也是醉了,默认只能通过本地 ...
- fedora 开启 apache 并 开启目录浏览模式
在内网中 暂时需要一台 文件 服务器,所以准备安装一台 http服务器并开启目录访问权限.这次使用 apache 在 fedora 28 机器上: 因为 fedora 28 已经包含 httpd 软件 ...
- 利用MVC Chart 打造后台图表、前端图表
应用场景是这个样子的:要做导出数据到PDF的功能,涉及到文本.表格.图表等内容.在做图表功能时,发现之前用Highcharts做的图表根本就不能集成到PDF中.这里需要一个能在程序后台就生成图表的功能 ...
- MySQL基础之 恢复数据和数据库迁移
1.mysql命令或者source命令恢复数据 这两个命令在进行恢复数据的时候要检查是否创建数据库.如果数据库不存在,则恢复失败. 数据库迁移 1.相同版本的mysql数据库之间的迁移. mysqld ...
- Flink 的广播变量
Flink 支持广播变量,就是将数据广播到具体的 taskmanager 上,数据存储在内存中,这样可以减缓大量的 shuffle 操作: 比如在数据 join 阶段,不可避免的就是大量的 shuff ...
- BZOJ4269:再见Xor(线性基)
Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...
- CentOS中安装Azkaban 2.5
必备软件 yum install git -y 单机安装步骤 git clone https://github.com/azkaban/azkaban.git cd azkaban; ./gradle ...
- Const vs. Readonly
Const 被const修饰的变量不能为静态,因为const实际隐式上已经是静态变量. const变量在声明时就必须进行初始化,否则会有编译错误. const变量的赋值是发生在编译期间 Readonl ...