题目传送门

今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构

注意到至多只有\(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的更多相关文章

  1. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  2. P1558 色板游戏 (线段树)

    题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...

  3. P1558 色板游戏 线段树+二进制状压

    好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...

  4. P1558 色板游戏 线段树(区间修改,区间查询)

    题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为 ...

  5. 线段树(压位)luogu P1558色板游戏

    题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...

  6. 【luogu P1558 色板游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...

  7. CF620E New Year Tree(树形+dfs序+线段树+状态压缩)

    题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...

  8. HDU 6183 Color it cdq分治 + 线段树 + 状态压缩

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Pro ...

  9. 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)

    传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...

随机推荐

  1. C++ 构造函数+析构函数

    3-2 构造函数的调用 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握构造函数和析构函数的调用: 创建类A:类中仅包含构造函数和析构 ...

  2. LightOJ - 1248 Dice (III) —— 期望

    题目链接:https://vjudge.net/problem/LightOJ-1248 1248 - Dice (III)    PDF (English) Statistics Forum Tim ...

  3. Sql 工资第二高(考虑并列)

    --题目:Employee表中有ID,Name,Salary三列,求薪资排序第二高的Employee的Name select * FROM [Employee] --等于2时为空,因为有并列第一 SE ...

  4. Contiki Rtimer 模块

    一.rtimer概述 The Contiki rtimer library provides scheduling and execution of real-time tasks (with pre ...

  5. jQuery Validate 插件为表单提供了强大的验证功能

    之前项目开发中,表单校验用的jQuery Validate 插件,这个插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的 ...

  6. 一些rtsp实现的开源代码

    * live.com   C/S   C++   http://www.live555.com     * darwin     S     C++   http://www.opensource.a ...

  7. python基础-大杂烩

    random()随机函数 import random print(random.choice('abcdefghij')) #随机取这些字母 print(random.choice(['apple', ...

  8. form 提交数据编码梳理

    之前对form单提交的操作一直都是迷迷糊糊,知道怎么用,但是随着ajax2的出现,我们有更多的方式操作form表单提交,但是底层的原理我们要好好的做个梳理. 常见的form提交有post和get这两种 ...

  9. (Nginx + Gunicorn) 时 nginx 400 request line is too large (4360 4094)

    查看nginx下面两个参数 值是否满足 client_header_buffer_size 512k;large_client_header_buffers 4 512k; 满足依然出现 如果ngin ...

  10. BZOJ4836: [Lydsy1704月赛]二元运算

    BZOJ4836: [Lydsy1704月赛]二元运算 https://lydsy.com/JudgeOnline/problem.php?id=4836 分析: 分开做,维护两个桶. 分治每次求\( ...