写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路.....

色板游戏

色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格。并从左到右标记为\(1, 2, ... L\)。

现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:

  1. \("C A B C"\) 指在\(A\)到 \(B\) 号方格中涂上颜色 \(C\)。
  2. \("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 色板游戏的更多相关文章

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

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

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

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

  3. Luogu P1558 色板游戏【线段树/状态压缩】By cellur925

    题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...

  4. Luogu P1558 色板游戏

    (此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...

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

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

  6. P1558 色板游戏

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

  7. AC日记——色板游戏 洛谷 P1558

    色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tre ...

  8. P1558 色板游戏 状压线段树

    P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...

  9. [luogu]P1070 道路游戏[DP]

    [luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...

随机推荐

  1. WEBSERVICE之JDK开发webservice

    转自:https://www.cnblogs.com/w-essay/p/7357262.html 一.开发工具与环境 1. jdk1.6版本以上(jdk1.6.0_21及以上版本) 2 .eclip ...

  2. 4.vim操作

    你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法. 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力 当 ...

  3. 基础apache命令

    在启动Apache服务之前,可以使用下面的命令来检查配置文件的正确性. C:\Apache2.2\bin> httpd  -n  Apache2.2  -t 还可以通过命令行控制Apache服务 ...

  4. composer的一些操作

    版本更新 命令行下:composer self-update 设置中国镜像 composer config -g repo.packagist composer https://packagist.p ...

  5. iOS开发 小知识点

    1/ iOS汉字百分号互相转换. //汉字 NSString * name = @"时间终于将我对你的爱消耗殆尽"; //汉字转为百分比 NSString * encodeStri ...

  6. c#中 abstract 和 virtual 的区别与用法

    先来看abstract方法,顾名思义,abstract方法就是抽象方法. 1.抽象方法就是没有实现的,必须是形如:  public abstract void Init();   2.拥有抽象方法的类 ...

  7. [C#学习笔记之异步编程模式2]BeginInvoke和EndInvoke方法 (转载)

    为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应 ...

  8. 记录sql执行顺序

    SQL 语句执行顺序为: FROM WHERE GROUP BY HAVING SELECT DISTINCT UNION ORDER BY 关于 SQL 语句的执行顺序,有三个值得我们注意的地方: ...

  9. 一些BFC

    我们可能会遇到这样的一些问题,比如:子元素浮动,父元素高度塌陷:父元素跟随子元素一起移动等 这是我们可以通过触发BFC来解决这样的问题. BFC为"块级格式化上下文".它是一个独立 ...

  10. Python-基础-day4

    深浅copy 1.先看赋值运算 h1 = [1,2,3,['aihuidi','hhhh']] h2 = h1 h1[0] = 111 print(h1) print(h2) #结果: # [111, ...