线段树(压位)luogu P1558色板游戏
题目背景
阿宝上学了,今天老师拿来了一块很长的涂色板。
题目描述
色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格。并从左到右标记为1, 2, ... L。
现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:
- "C A B C" 指在A到 B 号方格中涂上颜色 C。
- "P A B" 指老师的提问:A到 B号方格中有几种颜色。
学校的颜料盒中一共有 T 种颜料。为简便起见,我们把他们标记为 1, 2, ... T. 开始时色板上原有的颜色就为1号色。 面对如此复杂的问题,阿宝向你求助,你能帮助他吗?
输入输出格式
输入格式:
第一行有3个整数 L (1 <= L <= 100000), T (1 <= T <= 30) 和 O (1 <= O <= 100000)。 在这里O表示事件数。
接下来 O 行, 每行以 "C A B C" 或 "P A B" 得形式表示所要做的事情(这里 A, B, C 为整数, 可能A> B,这样的话需要你交换A和B)
输出格式:
对于老师的提问,做出相应的回答。每行一个整数。
输入输出样例
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
2
1 简单的线段树维护压位(当然你也可以开30颗线段树) code:
#include<iostream>
#include<cstdio>
using namespace std;
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
const int maxn=1e5+5;
struct FFF{
int l,r;
int sum;
int tag;
int mid(){return l+r>>1;}
int len(){return r-l+1;}
}t[maxn<<2];
int U,T;
int n,m;
void up(int o){
t[o].sum=t[ls(o)].sum|t[rs(o)].sum;
}
void build(int l=1,int r=n,int o=1){
t[o].l=l;t[o].r=r;
t[o].tag=0;
if(l==r){
t[o].sum=1;
return;
}
int mid=l+r>>1;
build(l,mid,ls(o));
build(mid+1,r,rs(o));
up(o);
}
void down(int o){
int &v=t[o].tag;
if(v){
for(int i=0;i<=1;++i){
t[ls(o)|i].tag=v;
t[ls(o)|i].sum=v;
}
v=0;
}
}
void add(int l,int r,int pos,int o=1){
if(l<=t[o].l&&t[o].r<=r){
t[o].tag=(1<<(pos-1));
t[o].sum=(1<<(pos-1));
return;
}
int mid=t[o].mid();
down(o);
if(l<=mid)add(l,r,pos,ls(o));
if(r>mid)add(l,r,pos,rs(o));
up(o);
}
int getsum(int l,int r,int o=1){
if(l<=t[o].l&&t[o].r<=r){
return t[o].sum;
}
int ans=0;
int mid=t[o].mid();
down(o);
if(l<=mid)ans|=getsum(l,r,ls(o));
if(r>mid)ans|=getsum(l,r,rs(o));
return ans;
}
inline int bcount(unsigned int x){
int ans=0;
for(;x;x>>=1)if(x&1)++ans;
return ans;
}
signed main(){
cin>>n>>T>>m;
U=(1<<(T))-1;
build();
while(m--){
char op[3];
int l,r,x;
scanf("%s",op);
cin>>l>>r;
if(r<l)r^=l^=r^=l;
if(op[0]=='C'){cin>>x;add(l,r,x);}
if(op[0]=='P'){
int ans=getsum(l,r);
cout<<bcount(ans)<<endl;
}
}
return 0;
}
线段树(压位)luogu P1558色板游戏的更多相关文章
- UOJ #314. 【NOI2017】整数 | 线段树 压位
题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)
传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...
- Luogu P1558 色板游戏
(此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...
- [BZOJ4942][Noi2017]整数 线段树+压位
用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
随机推荐
- C++虚函数与纯虚函数用法与区别(转载)
1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...
- Theos简介
[Theos简介] Theos is a cross-platform suite of development tools for managing, developing, and deployi ...
- solr开发 小案例
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- Linux查看操作系统版本的几种方式
Linux查看操作系统版本的几种方式: 1.uname -a 2.lsb_release -a 3.cat /etc/issue 4.cat /proc/version 5.cat /etc/redh ...
- ROS naviagtion analysis: costmap_2d--StaticLayer
博客转载自:https://blog.csdn.net/u013158492/article/details/50493246 从UML中能够看到,StaticLayer主要是在实现Layer层要求实 ...
- 10.IN 操作符
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...
- Django Rest Framework框架 ---- url控制器
Django Rest Framework框架 ---- url控制器
- Python 面向对象class(2)
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- 什么是Condition Number(条件数)?
In the field of numerical analysis, the condition number of a function with respect to an argument m ...
- 编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变
建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predi ...