luogu 1558 色板游戏
写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路.....
色板游戏
色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格。并从左到右标记为\(1, 2, ... L\)。
现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:
- \("C A B C"\) 指在\(A\)到 \(B\) 号方格中涂上颜色 \(C\)。
- \("P A B"\) 指老师的提问:\(A\)到 \(B\)号方格中有几种颜色。
学校的颜料盒中一共有 \(T\) 种颜料。为简便起见,我们把他们标记为 \(1, 2, ... T\). 开始时色板上原有的颜色就为\(1\)号色。 面对如此复杂的问题,阿宝向你求助,你能帮助他吗?
这道题一看数据范围,emmm,可以状压。
然后,一眼切
/*
全wa代码
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 100001;
struct edge {
int l,r,w,f,size;
} tree[N<<2];
void up(int k) {
tree[k].w=tree[k<<1].w|tree[k<<1|1].w;
}
void build(int k,int ll,int rr) {
tree[k].l=ll,tree[k].r=rr,tree[k].size=rr-ll+1;
tree[k].f=0;
if(ll==rr) {
tree[k].w=1;
return;
}
int m=(ll+rr)>>1;
build(k<<1,ll,m);
build(k<<1|1,m+1,rr);
up(k);
}
void down(int k) {
if(tree[k].f) {
tree[k<<1].f=tree[k].f;
tree[k<<1|1].f=tree[k].f;
tree[k<<1].w=tree[k].f;
tree[k<<1|1].w=tree[k].f;
tree[k].f=0;
}
}
void C_interval(int k,int ll,int rr,int val) {
if(tree[k].l>=ll && tree[k].r<=rr) {
tree[k].f=val;
tree[k].w=val;
return ;
}
down(k);
int m=(tree[k].l+tree[k].r)>>1;
if(ll<=m) C_interval(k<<1,ll,rr,val);
if(rr>m) C_interval(k<<1|1,ll,rr,val);
up(k);
}
int ask_interval(int k,int ll,int rr) {
int ans=0;
if(tree[k].l>=ll && tree[k].r<=rr) {
ans|=tree[k].w;
return ans;
}
down(k);
int m=(tree[k].l+tree[k].r)>>1;
if(ll<=m) ans|=ask_interval(k<<1,ll,rr);
if(rr>m) ans|=ask_interval(k<<1|1,ll,rr);
up(k);
return ans;
}
int n,m,q;
int calc(int x) {
int ans=0;
while(x) {
if(x&1)ans++;
x>>=1;
}
return ans;
}
int main() {
scanf("%d%d%d",&n,&m,&q);
build(1,1,n);
while(q--) {
int a,b,c;
char s;
cin >> s;
if(s=='C') {
scanf("%d%d%d",&a,&b,&c);
C_interval(1,a,b,(1<<(c-1))) ;
}
if(s=='P') {
scanf("%d%d",&a,&b);
printf("%d\n",calc(ask_interval(1,a,b)));
}
}
}
知道为啥吗??
因为
它a和b的大小压根不能确定!
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 100001;
struct edge {
int l,r,w,f,size;
} tree[N<<2];
void up(int k) {
tree[k].w=tree[k<<1].w|tree[k<<1|1].w;
}
void build(int k,int ll,int rr) {
tree[k].l=ll,tree[k].r=rr,tree[k].size=rr-ll+1;
tree[k].f=0;
if(ll==rr) {
tree[k].w=1;
return;
}
int m=(ll+rr)>>1;
build(k<<1,ll,m);
build(k<<1|1,m+1,rr);
up(k);
}
void down(int k) {
if(tree[k].f) {
tree[k<<1].f=tree[k].f;
tree[k<<1|1].f=tree[k].f;
tree[k<<1].w=tree[k].f;
tree[k<<1|1].w=tree[k].f;
tree[k].f=0;
}
}
void C_interval(int k,int ll,int rr,int val) {
if(tree[k].l>=ll && tree[k].r<=rr) {
tree[k].f=val;
tree[k].w=val;
return ;
}
down(k);
int m=(tree[k].l+tree[k].r)>>1;
if(ll<=m) C_interval(k<<1,ll,rr,val);
if(rr>m) C_interval(k<<1|1,ll,rr,val);
up(k);
}
int ask_interval(int k,int ll,int rr) {
int ans=0;
if(tree[k].l>=ll && tree[k].r<=rr) {
ans|=tree[k].w;
return ans;
}
down(k);
int m=(tree[k].l+tree[k].r)>>1;
if(ll<=m) ans|=ask_interval(k<<1,ll,rr);
if(rr>m) ans|=ask_interval(k<<1|1,ll,rr);
up(k);
return ans;
}
int n,m,q;
int calc(int x) {
int ans=0;
while(x) {
if(x&1)ans++;
x>>=1;
}
return ans;
}
int main() {
scanf("%d%d%d",&n,&m,&q);
build(1,1,n);
while(q--) {
int a,b,c;
char s;
cin >> s;
if(s=='C') {
scanf("%d%d%d",&a,&b,&c);
C_interval(1,min(a,b),max(a,b),(1<<(c-1))) ;
}
if(s=='P') {
scanf("%d%d",&a,&b);
printf("%d\n",calc(ask_interval(1,min(a,b),max(a,b))));
}
}
return 0;
}
luogu 1558 色板游戏的更多相关文章
- 【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大小的数组,这样每次更新的时候暴力循环 ...
- Luogu P1558 色板游戏
(此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- AC日记——色板游戏 洛谷 P1558
色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tre ...
- P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...
- [luogu]P1070 道路游戏[DP]
[luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
随机推荐
- 原生js实现复选框
简单排版 <style> .box { display: flex; align-items: center; } #allSelect, p { width: 20px; height: ...
- iris中间件
最近使用golang写的时候涉及到权限校验,用中间件(使用iris框架内的东西) 自己摸索出一种自己的方式 iris.UseFunc(MiddlewareFunc)使用这个方法,会在所有的请求之前执行 ...
- spring Ioc Aop整合
之前用DWP项目做spring的IOC,xml总是提示有问题,之后改用maven通过. 之后将这一块的内容补充. 仔细考虑一下spring 的IOC是无处不在的,演示Aop也需要依赖spring的IO ...
- div position:fixed后,水平居中的问题
.div{position:fixed;margin:auto;left:0; right:0; top:0; bottom:0;width:200px; height:150px;}
- [Reading] Asking while Reading
Asking while Reading ——读Java垃圾收集器与内存分配策略 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 为什么 ...
- C++小程序(1)——文件整理工具
网上下载的漫画是jpg或png之类的图片文件,用系统自带的图片管理器看不方便,想要能把图片想网页一样浏览的功能,找了很多图片管理器也没有带这个功能,于是就自己编写了一个小程序实现. 思想就是在图片目录 ...
- UVa 11292 The Dragon of Loowater 【贪心】
题意:有一条有n个头的恶龙,有m个骑士去砍掉它们的头,每个骑士可以砍直径不超过x的头,问怎样雇佣骑士,使花的钱最少 把头的直径从小到大排序,骑士的能力值也从小到大排序,再一个一个地去砍头 #inclu ...
- CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法
CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法 .recomend-list{ width:1200px; a{ @extend %fl; margin-right: 30px; width ...
- Unity中 Animator 与Animation 区别
①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的.Animation 控制一个动画的播放,而Animator是多个动画之间相互切换,并且Anima ...
- Codeforces div2 #499 B. Planning The Expedition 大水题
已经是水到一定程度了QAQ- Code: #include<cstdio> #include<algorithm> #include<cstring> using ...