Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构
注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环一遍。hhhhh。
可能这样比较好想吧,但是比正解状态压缩一下不知道差到哪里去了:)。开始还智障地把每次循环的次数开成30,那给出的色板数有什么用hh,这样是80分,改后AC。
#include<cstdio>
#include<algorithm>
#define maxn 100090
using namespace std;
int n,Q,tot;
char op[10];
struct SegmentTree{
int l,r;int lazy;
int col[35];
}t[maxn*4];
void re(int &x)
{
x=0;
char ch=getchar();
bool flag=false;
while(ch<'0'||ch>'9') flag|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
x=flag ? -x : x;
}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].col[1]=1;
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].col[1]=t[p<<1].col[1]+t[p<<1|1].col[1];
}
void update(int p)
{
if(!t[p].lazy||t[p].l==t[p].r) return ;
t[p<<1].lazy=t[p].lazy;t[p<<1|1].lazy=t[p].lazy;
for(int i=1;i<=tot;i++)
t[p<<1].col[i]=0,t[p<<1|1].col[i]=0;
t[p<<1].col[t[p].lazy]+=t[p<<1].r-t[p<<1].l+1;
t[p<<1|1].col[t[p].lazy]+=t[p<<1|1].r-t[p<<1|1].l+1;
t[p].lazy=0;
}
void change(int p,int l,int r,int id)
{
update(p);
if(t[p].l==l&&t[p].r==r)
{
for(int i=1;i<=tot;i++)
t[p].col[i]=0;
t[p].col[id]+=r-l+1;
t[p].lazy=id;
return ;
}
int mid=(t[p].l+t[p].r)>>1;
if(l>mid) change(p<<1|1,l,r,id);
else if(r<=mid) change(p<<1,l,r,id);
else change(p<<1,l,mid,id),change(p<<1|1,mid+1,r,id);
for(int i=1;i<=tot;i++)
t[p].col[i]=t[p<<1].col[i]+t[p<<1|1].col[i];
}
int ask(int p,int l,int r,int id)
{
update(p);
if(t[p].l==l&&t[p].r==r) return t[p].col[id];
int mid=(t[p].l+t[p].r)>>1;
if(l>mid) return ask(p<<1|1,l,r,id);
else if(r<=mid) return ask(p<<1,l,r,id);
else return ask(p<<1,l,mid,id)+ask(p<<1|1,mid+1,r,id);
}
int main()
{
scanf("%d%d%d",&n,&tot,&Q);
build(1,1,n);
while(Q--)
{
scanf("%s",op+1);
if(op[1]=='C')
{
int x=0,y=0,z=0;
scanf("%d%d%d",&x,&y,&z);
if(x>y) swap(x,y);
change(1,x,y,z);
}
else if(op[1]=='P')
{
int x=0,y=0;
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
int cnt=0;
for(int i=1;i<=tot;i++)
if(ask(1,x,y,i)>0) cnt++;
printf("%d\n",cnt);
}
}
return 0;
}
最正确的做法是把每个节点的色板情况压成一个状态数,更新的时候用位运算更新==。这种方法我没有写,找了一个大佬写的:传送门
Luogu P1558 色板游戏【线段树/状态压缩】By cellur925的更多相关文章
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏 (线段树)
题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...
- P1558 色板游戏 线段树+二进制状压
好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...
- P1558 色板游戏 线段树(区间修改,区间查询)
题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为 ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- CF620E New Year Tree(树形+dfs序+线段树+状态压缩)
题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...
- HDU 6183 Color it cdq分治 + 线段树 + 状态压缩
Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Pro ...
- 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)
传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...
随机推荐
- HTML5/CSS3鼠标滑过图片滤镜动画效果
在线演示 本地下载
- legend2---开发日志15(功能需求明确,设计好类和结构的好处是)
legend2---开发日志15(功能需求明确,设计好类和结构的好处是) 一.总结 一句话总结: 极快简化编程,节约大量时间 1.多个类型的物品,比如商店和寻宝的丹药,装备,特性书,英雄石等等 应该怎 ...
- 文件操作:os模块与os.path模块
一.os与os.path 原创:http://www.cnblogs.com/lovemo1314/archive/2010/11/08/1871781.html os模块用于处理文件及文件夹,包括文 ...
- hdu-5802 Windows 10(贪心)
题目链接: Windows 10 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- Sed在匹配行前后加入一行
a 追加内容 sed ‘/匹配词/a\要加入的内容’ example.file(将内容追加到匹配的目标行的下一行位置)i 插入内容 sed ‘/匹配词/i\要加入的内容’ example.file 将 ...
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- jQuery bootstrap框架下重置下拉框选择
前端页面中下拉选择框采用bootstrap-select美化,如下图:
- <十八>UML核心视图动态视图之协作图
一:协作图 --->描述了对象间交互的一种模式.它通过对象之间的连接和它们相互发送的消息来显示参与交互的对象 --->协作图可以有对象和主角实例,以及描述它们之间关系和交互的连接和消息.通 ...
- DataGridColum的bug
Datagrid有多个bug: 1,不支持DynamicResource的东西 2, 在Column隐藏后再显示, ColumnHeader的Tag或者DataContext为null. 解决办法: ...
- C语言单精度浮点型转换算法
文章来源:http://blog.csdn.NET/educast/article/details/8522818 感谢原作者. 关于16进制浮点数对于大小为32-bit的浮点数(32-bit为单精度 ...