P1558 色板游戏 (线段树)
题目链接
Solution
一个简单的 或 线段树.竟然坑了我一个小时...
因为颜色很小,所以把状态压起来.
然后每个节点上的数值代表当前颜色状态.
然后节点合并很简单,直接或起来.
需要注意一下的地方是修改时的 \(lazy\) ,要完全覆盖,这里不能或.
Code
#include<bits/stdc++.h>
#define ll long long
#define in(x) x=read()
#define mid (l+r)/2
#define N 100001
using namespace std;
ll sgm[N*4],lazy[N*4],n,m,t;
int read()
{
char ch=getchar(); int f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return f*w;
}
void build(int node,int l,int r)
{
sgm[node]=1; if(l==r)return;
build(node*2,l,mid),build(node*2+1,mid+1,r);
}
void push_down(int node)
{
if(!lazy[node])return;
lazy[node*2]=lazy[node*2+1]=lazy[node];
sgm[node*2]=sgm[node*2+1]=lazy[node]; lazy[node]=0;
}
void change(int node,int l,int r,int L,int R,int v)
{
if(l>R||r<L)return;
if(l>=L&&r<=R){
sgm[node]=lazy[node]=(1<<v-1);
return;
}
push_down(node);
change(node*2,l,mid,L,R,v);
change(node*2+1,mid+1,r,L,R,v);
sgm[node]=sgm[node*2]|sgm[node*2+1];
}
ll query(int node,int l,int r,int L,int R)
{
if(l>R||r<L)return 0;
if(l>=L&&r<=R)return sgm[node];
push_down(node);
return query(node*2,l,mid,L,R)|query(node*2+1,mid+1,r,L,R);
}
int main()
{
in(n),in(t),in(m);
build(1,1,n);
while(m--)
{
char opt; int l,r,v;
cin>>opt;
if(opt=='C')
{
in(l),in(r),in(v);
if(l>r)swap(l,r);
change(1,1,n,l,r,v);
}
else
{
in(l),in(r); int ans=0;
if(l>r)swap(l,r);
ll pp=query(1,1,n,l,r);
for(int i=0;i<=t;i++)
if(pp&(1<<i))ans++;
printf("%d\n",ans);
}
}
}
P1558 色板游戏 (线段树)的更多相关文章
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏 线段树+二进制状压
好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...
- P1558 色板游戏 线段树(区间修改,区间查询)
题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为 ...
- P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- 洛谷P1558 色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有 ...
- Luogu P1558 色板游戏
(此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...
随机推荐
- cout对象一些常用方法的总结
cout.precision(n); 这个方法的功能是,设置精度为n,返还值是上一次的设置精度. #include <iostream> using namespace std; int ...
- 网络编程——UDP协议和通信
第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...
- Activiti学习记录(二)
1.初始化数据库 使用工作流引擎创建23张表 public class TestActiviti { /** * 使用代码创建工作流需要的23张表 */ @Test public void creat ...
- struts+hibernate+spring整合过程常见问题收集
1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefF ...
- 如何在vue项目中使用md5加密
npm安装: npm install --save js-md5 1.在需要使用的项目文件中引入: import md5 from 'js-md5'; 使用: md5('hello world') / ...
- indexOf和contains查找的字符串是空字符,返回值是什么呢?
一直以为indexOf方法查找的字符串如果不匹配返回值就是-1.今天发现空字符返回值是0.看源码原来如此,阴沟里翻船啊!
- centos下修改docker连接docker_host默认方式为tls方式
1.安装docker,请参考官网文档 centos下安装docker 2.安装完成应该可以使用docker的各种命令连接docker host.docker host运行在本机上,但与localhos ...
- 微信小程序中 this.setData is not a function报错
在微信小程序中我们一般通过以下方式来修改data中的数据: 比如获取小程序缓存: wx.getStorage({ key: 'is_screen', success: function (res) { ...
- 微信小程序navigator的open-type跳转问题
navigator的open-type属性 可选值 'navigate'.'redirect'.'switchTab',对应于wx.navigateTo.wx.redirectTo.wx.switch ...
- JZOJ 1267. 路障
1267. 路障(block.pas/c/cpp) (File IO): input:block.in output:block.out Time Limits: 1000 ms Memory Li ...