P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树
每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色
因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示此区间是否含有\(i\)这种颜色,线段树合并信息时左右儿子信息或一下就好了。
scanf读入char炸了我好久,最后换成cin就AC了
AC Code:
#include <iostream>
#define MAXN 100010
#define sl (x<<1)
#define sr (x<<1|1)
#define LL long long
using namespace std;
int l,t,o;
inline void m_swap(int &a, int &b){
int t=a;
a=b;
b=t;
}
struct nod{
int l, r;
LL val, lazy;
} tre[MAXN*4];
void push_up(int x){
tre[x].val = tre[sl].val|tre[sr].val;
}
void built(int x, int l, int r){
tre[x].l=l,tre[x].r=r;
if(l==r){
tre[x].val=1;
return;
}
int mid=(l+r)>>1;
built(sl, l, mid);
built(sr, mid+1, r);
push_up(x);
}
void push_down(int x){
if(tre[x].lazy==0) return;
tre[sl].val=tre[sr].val=tre[x].lazy;
tre[sl].lazy=tre[sr].lazy=tre[x].lazy;
tre[x].lazy=0;
}
void change(int x, int l, int r, LL val){
if(l<=tre[x].l&&tre[x].r<=r){
tre[x].val=val;
tre[x].lazy=val;
return;
}
push_down(x);
int mid=(tre[x].l+tre[x].r)>>1;
if(l<=mid) change(sl, l, r, val);
if(r>mid) change(sr, l, r, val);
push_up(x);
}
LL query(int x, int l, int r){
if(l<=tre[x].l&&tre[x].r<=r)
return tre[x].val;
push_down(x);
int mid=(tre[x].l+tre[x].r)>>1;
LL ans=0;
if(l<=mid) ans|=query(sl, l, r);
if(r>mid) ans|=query(sr, l, r);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin>>l>>t>>o;
built(1, 1, l);
while(o--){
char opt;cin>>opt;
if(opt=='C'){
int a,b,c;cin>>a>>b>>c;
if(a>b) m_swap(a,b);
LL val=(1<<(c-1));
change(1, a, b, val);
}else{
int a,b;cin>>a>>b;
if(a>b) m_swap(a,b);
LL res=query(1, a, b);
int ans=0;
for(int i=0;i<=t-1;++i)
if((1<<i)&res) ans++;
cout<<ans<<endl;
}
}
return 0;
}
P1558 色板游戏 状压线段树的更多相关文章
- CF620E New Year Tree 状压+线段树(+dfs序?)
借用学长的活:60种颜色是突破口(我咋不知道QAQ) 好像这几道都是线段树+dfs序??于是你可以把60种颜色压进一个long long 里,然后向上合并的时候与一下(太妙了~) 所以记得开long ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏 (线段树)
题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...
随机推荐
- 『Django』第N+1节: Django自带的认证系统 - auth
个人网站: lipeiguan.top 以后会慢慢转移到个人网站, 欢迎大家收藏^ . ^ 写在前面 我们在开发一个网站的时候, 经常需要实现网站的用户系统. 这个时候我们需要实现用户注册.用户登录. ...
- rman备份跳过read only数据文件,减少备份总量,加快备份时间
客户需求,RMAN备份时间过长,想缩短备份时间,优化备份. 客户基于表空间进行历史数据归档的方式,将历史的表空间进行read only,想让RMAN跳过只读表空间,减少RMAN备份的数据总量,从而缩短 ...
- Myatis之bind标签
myBatis的bind的标签,一般的用法都是 <if test="name!= null and name!= '' "> <bind name="u ...
- 学习笔记-Rabin-Karp哈希
在数学一本通上看过这两人名字,现在又出现了... 思想: 用一个整数表示一个字符串 \(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\ ...
- [学习笔记]pb_ds库
前言 其实我很早开始就用pb_ds库了,用起来确实方便.但最近感觉还是对这个了解颇少,还是来补一下 话说有人会忘记头文件,其实这有个伎俩,找到电脑上的g++文件夹.Ubuntu应该在etc中,Wind ...
- Go 代码风格和规范
Go 语言写起来类似于C语言,因此熟悉C语言及其派生语言(C++.C#.Objective-C 等)的人都会迅速熟悉这门语言 编码风格 标识符命名规范 在习惯上,Go语言程序员推荐使用驼峰式命名,当名 ...
- Python Selenium、PIL、pytesser 识别验证码
思路: 使用Selenium库把带有验证码的页面截取下来 利用验证码的xpath截取该页面的验证码 对验证码图片进行降噪.二值化.灰度化处理后再使用pytesser识别 使用固定的账户密码对比验证码正 ...
- /sockjs-node/info 报错问题
首先 sockjs-node 确实是维持全双工通信用的,关键在于为什么要有这个东西,其实其作用就是保证我们在改完代码重新编译之后,能够通知浏览器重新加载变更结果(我也是因为之前都可以改完代码之后浏览器 ...
- 一款结合nmap及mascan还有shodan的扫描脚本
github在这里 https://github.com/s0md3v/Silver 很是舒服 Usage Note: Silver scans all TCP ports by default i. ...
- js获取地理位置
直接上代码: if(navigator.geolocation) { navigator.geolocation.getCurrentPosition( function (position) { v ...