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

色板游戏

色板长度为\(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. docker迁移步骤

    1. 创建快照:docker commit -p 30b8f18f20b4 container-backup (可以通过docker images 查看docker镜像) 2. 镜像保存在本地机器中: ...

  2. Docker容器查看ip地址

    第一步:进入centos7容器:yum install net-tools -y     我这里已经加载过,所以没有继续加载 第二步:加载完成之后可以输入 ifconfig查看ip地址

  3. MVC 全局异常处理(适用多人操作)

    自定义特性: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  4. SQL Server 从字符串中提取中文、英文、数字

    --[提取中文] IF OBJECT_ID('dbo.fun_getCN') IS NOT NULL DROP FUNCTION dbo.fun_getCN GO create function db ...

  5. 迁移IPv6:6To4隧道技术

    1. IPv6 路由选择协议 首先要讨论的是RIPng(下一代).RIP非常适合用于小型网络.这正是它没有惨遭淘汰,继续用于 IPV6网络的原因.另外,还有EIGRPv6,因为它有独立于协议的模块,只 ...

  6. 《Exception》第八次团队作业:Alpha冲刺(第一天)

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件测试基础技术.2.学习迭代式增量软 ...

  7. 基础——(4)SR Latch(SR锁存器)

    Digital logic gets really interesting when we connect the output of gates back to an input. The SR l ...

  8. [NOIP2004提高组]虫食算

    题目:洛谷P1092.codevs1064.Vijos P1099. 题目大意:给你一个$n$进制.每个数都是$n$位的三个数a,b,c,这些数的数位由字母表示(共$n$个字母,从‘A’开始),所有数 ...

  9. 浅谈optparse 解析命令行参数库

    使用的背景 在工作中我们经常要制定运行脚本的一些参数,因为有些东西是随着我么需求要改变的,所以在为们写程序的时候就一定不能把写死,这样我们就要设置参数 在python中我们可以通过sys 模板的arg ...

  10. [WPF] 圆形等待效果

    原文:[WPF] 圆形等待效果 自己做着玩儿的,留着以后用,效果类似下面的 GIF 动画. <Grid Width="35" Height="35"> ...