题目背景

阿宝上学了,今天老师拿来了一块很长的涂色板。

题目描述

色板长度为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号色。 面对如此复杂的问题,阿宝向你求助,你能帮助他吗?

输入输出格式

输入格式:

第一行有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)

输出格式:

对于老师的提问,做出相应的回答。每行一个整数。

输入输出样例

输入样例#1:

2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
输出样例#1:

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色板游戏的更多相关文章

  1. UOJ #314. 【NOI2017】整数 | 线段树 压位

    题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...

  2. 【luogu P1558 色板游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...

  3. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

    传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...

  4. Luogu P1558 色板游戏

    (此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...

  5. [BZOJ4942][Noi2017]整数 线段树+压位

    用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...

  6. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  7. Luogu P1558 色板游戏【线段树/状态压缩】By cellur925

    题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...

  8. P1558 色板游戏 状压线段树

    P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...

  9. P1558 色板游戏

    P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

随机推荐

  1. log4net 入门教程

    1.下载dll 下载地址:http://mirror.reverse.net/pub/apache/logging/log4net/binaries/ github:https://github.co ...

  2. HDU ACM Fibonacci

    Problem Description Fibonacci numbers are well-known as follow: Now given an integer N, please find ...

  3. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 2_Linear regression with one variable 单变量线性回归

    Lecture2   Linear regression with one variable  单变量线性回归 2.1 模型表示 Model Representation 2.1.1  线性回归 Li ...

  4. 19-从零玩转JavaWeb-继承关系与方法覆盖

    配套视频详解 继承子类与父类的关系 继承子类与父类的关系代码演示 继承方法的覆盖 方法覆盖原则 一.继承编写过程   二.子类可以继承父类当中哪些内容 可以自行把修饰符换下, 然后查看子类能不能访问 ...

  5. java基础之JDBC七:C3P0连接池的使用

    使用C3P0的前提是需要引入jar包 具体使用如下: /** * c3p0的应用 * 前提:引入c3p0的jar包 */ public class Test { public static void ...

  6. integer encoding vs 1-hot (py)

    https://github.com/szilard/benchm-ml/issues/1 glouppe commented on 7 May 2015 Thanks for the benchma ...

  7. Python3 网络爬虫开发实战学习弱点书签

    1. urllib.robotparse模块对robot.txt文件的解析,can_fetch()方法和parse()方法. Page121 2. lxml.etree模块自动补全Html代码,Htm ...

  8. laravel与front-end

    准备工作 在此之前要安装node  . npm .这里安装node . npm 就不介绍了,百度一大把. 安装所有的npm依赖包 //进入项目的根目录 npm install 安装完后会出现一个nod ...

  9. redis过期key的清理策略

    一,有三种不同的删除策略(1),立即清理.在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作. (2),惰性清理.键过期了就过期了,不管.当读/写一个已经过期的 ...

  10. [GO]将随机生成的四位数字拆分后放到一个切片里

    package main import ( "math/rand" "time" "fmt" ) func InitData(p *int) ...