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就挂了..... ...
随机推荐
- JQuery判断数组中是否包含某个字符串
var arry = [ "C#", "html", "css", "JavaScript" ]; var result ...
- Android--根据子控件的大小自动换行的ViewGroup
1.自定义ViewGroup /** * Created by Administrator on 2016/2/26. * * --------自动换行的ViewGroup----------- */ ...
- web测试实践
参会人员:赵天宇,周静,张双双,张玉 参会地点:微信群 参会内容:决定评测软件 最后会议结论:决定了选择用中国大学mooc(https://www.icourse163.org/)和结合竞品对象-清华 ...
- 【python】python中的json、字典dict
定义 python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转.既然都是key-value格式,为啥还需要进行格式 ...
- Prometheus Node_exporter 之 Network Traffic Detail
Network Traffic Detail /proc/net/dev 1. Network Traffic by Packets type: GraphUnit: packets/secLabel ...
- 【SVN】Linux下svn搭建配置全过程——初学者轻松上手篇
版本控制主要用到的是git和svn,其中svn界面化使用操作简单,本篇简单介绍SVN搭建配置全过程. 1. 下载并安装 yum install subversion 查看版本 svnserve --v ...
- 一般处理程序HttpHandler的应用
ashx 一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩展名.一个httpHandler接受并处理一个http请求,类比于Java中的servlet.类比于在Ja ...
- 获取 MySQL 崩溃时的 core file
对于一般进程,要让进程崩溃时能生成 core file 用于调试,只需要设置 rlimit 的 core file size > 0 即可.比如,用在 ulimit -c unlimited 时 ...
- Objects聚合分组,统计结果个数(Count)
参考:http://python.usyiyi.cn/django/topics/db/aggregation.html from django.db.models import Count toda ...
- Java语言的主要特点
Java语言有很多的优点,可靠.安全.编译和解释型语言.分布式.多线程.完全面向对象.与平台无关性等等. 与平台无关性 Java语言最大的优势在于与平台无关性,也就是可以跨平台使用. 绝大多数的编程语 ...