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< ...
随机推荐
- Ubuntu apt-get update 失败【转】
本文转载自:http://www.jianshu.com/p/0de2b5717ce8 1 $ sudo apt-get update 报了一堆错误: Err http://cn.archive.ub ...
- hihocoder hiho第38周: 二分·二分答案 (二分搜索算法应用:二分搜索值+bfs判断可行性 )
题目1 : 二分·二分答案 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后 ...
- SQL语句编写注意问题
下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍.在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描 ...
- html5--2.9新的布局元素(5)-hgroup/address
html5--2.9新的布局元素(5)-hgroup/address 学习要点 了解hgroup/address元素的语义和用法 通过实例理解hgroup/address元素的用法 对照新元素布局与d ...
- .NET中Eval()方法大全
<%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# ...
- python-常用内置函数与装饰器
1.常用的python函数 abs 求绝对值 all 判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any ...
- T58
他们投产的新轿车广获传媒报道.The launch of their new saloon received much media coverage.法律规定禁止近亲结婚.Marriages in p ...
- 「LuoguP2365」 任务安排(dp
题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti. 在每批任务开 ...
- 【Lintcode】070.Binary Tree Level Order Traversal II
题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...
- 开源.Net项目合集
http://www.cnblogs.com/StrangeCity/p/OpenSourceProject.html