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没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...
随机推荐
- java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序
package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...
- Java程序调用自动关机指令 1分钟内自动关机
package com.swift;//可以不要这句 import java.io.IOException; public class Shutdown100 { public static void ...
- c++ bitset 10进制转二进制
#include <bitset> using namespace std; void main() { int a; cin>>a; cout<<bitset&l ...
- SQL Server数据库日志清除
第一步 将数据库转换成 simple 模式 USE master GO ALTER DATABASE 所要删除日志的数据库名 SET RECOVERY SIMPLE WITH NO_WAIT GO 第 ...
- 第三章JavaScript 内置对象
1 Number 1.1 属性 MAX_VALUE JS可以表示的最大的数字 MIN_VALUE JS可以表示的最小的数字 1.2 方法 toFixed(length) 指定保留长度的小数 toExp ...
- (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植
如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资.如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows ...
- Linux常见的系統进程
前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高.而且总是会听到业务线同学询问“xxx这个是啥进程啊?咋开启了这么多?” 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些 ...
- 虚拟机中配置SQL SERVER2008R2远程访问
VM虚拟机中配置数据库访问 选择虚拟机设置--硬件--网络适配器,选择桥接模式:直接连接物理网络 不可选用主机模式(与主机共享专用网络) 数据库远程配置,转自:http://jingyan.baidu ...
- 动态规划、记忆化搜索:HDU1978-How many ways
Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标 ...
- MySQL创建数据库及用户
create database ${db_name} default charset utf8 COLLATE utf8_general_ci; grant all on ${db_name}.* t ...