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

色板游戏

色板长度为\(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. Node.js:连接 MongoDB

    ylbtech-Node.js:连接 MongoDB 1.返回顶部 1. Node.js 连接 MongoDB MongoDB是一种文档导向数据库管理系统,由C++撰写而成. 本章节我们将为大家介绍如 ...

  2. 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  3. mongo服务器异常

    1.Detected unclean shutdown - /data/db/mongod.lock is not empty. 前几天把研究用的虚拟机直接关了回家过年,今天启动发现启动不了,报了个u ...

  4. BZOJ 1500 splay终结版...

    GSS系列有一丝丝像- 只不过那个是线段树 这个是splay 翻转 插入 删除啥的就是普通的splay 合在一起了而已 //By SiriusRen #include <cstdio> # ...

  5. 安装全局可执行的gulp

    gulp需要作为项目的开发依赖(devDependencies)安装,全局安装了gulp是无法执行项目的,不单单需要全局安装 gulp:npm install gulp -g,也需要作为项目的开发依赖 ...

  6. servletconfig和servletcontext学习

    servletconfig java.lang.String getInitParameter(java.lang.String name)  //根据参数名获取参数值 java.util.Enume ...

  7. easyUI datagarid单元格动态合并

    第二列根据第一列合并,第三列根据第二列合并.层级关系. /* * tableID表格的id * colList要合并的字段例如:"overcount,totalcount" */ ...

  8. 【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游 - LCT+泰勒展开

    咕咕咕?咕咕咕! 题意: Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数学的语言展现出来. 这印证了一句古老的名言 ...

  9. 【XSY2692】杨柳 - 网络流

    题目来源:2018冬令营模拟测试赛(十) 题解: 继续鬼畜网络流…… 首先这题有个显然的做法:bfs预处理出每个起点到每个终点的最短步数,然后直接建边加超级源汇跑费用流即可: 但是这样边数是$n^2$ ...

  10. python之类与对象属性的增删改查

    类属性与对象属性的增删改查 类属性的增删改查 class School: """ 文档 """ Teacher = "老王&quo ...