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 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
随机推荐
- docker迁移步骤
1. 创建快照:docker commit -p 30b8f18f20b4 container-backup (可以通过docker images 查看docker镜像) 2. 镜像保存在本地机器中: ...
- Docker容器查看ip地址
第一步:进入centos7容器:yum install net-tools -y 我这里已经加载过,所以没有继续加载 第二步:加载完成之后可以输入 ifconfig查看ip地址
- MVC 全局异常处理(适用多人操作)
自定义特性: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- SQL Server 从字符串中提取中文、英文、数字
--[提取中文] IF OBJECT_ID('dbo.fun_getCN') IS NOT NULL DROP FUNCTION dbo.fun_getCN GO create function db ...
- 迁移IPv6:6To4隧道技术
1. IPv6 路由选择协议 首先要讨论的是RIPng(下一代).RIP非常适合用于小型网络.这正是它没有惨遭淘汰,继续用于 IPV6网络的原因.另外,还有EIGRPv6,因为它有独立于协议的模块,只 ...
- 《Exception》第八次团队作业:Alpha冲刺(第一天)
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件测试基础技术.2.学习迭代式增量软 ...
- 基础——(4)SR Latch(SR锁存器)
Digital logic gets really interesting when we connect the output of gates back to an input. The SR l ...
- [NOIP2004提高组]虫食算
题目:洛谷P1092.codevs1064.Vijos P1099. 题目大意:给你一个$n$进制.每个数都是$n$位的三个数a,b,c,这些数的数位由字母表示(共$n$个字母,从‘A’开始),所有数 ...
- 浅谈optparse 解析命令行参数库
使用的背景 在工作中我们经常要制定运行脚本的一些参数,因为有些东西是随着我么需求要改变的,所以在为们写程序的时候就一定不能把写死,这样我们就要设置参数 在python中我们可以通过sys 模板的arg ...
- [WPF] 圆形等待效果
原文:[WPF] 圆形等待效果 自己做着玩儿的,留着以后用,效果类似下面的 GIF 动画. <Grid Width="35" Height="35"> ...