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 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...
随机推荐
- Scratch 母鸡保护鸡蛋
今天我们一起实现一个“母鸡保护鸡蛋”的小游戏 具体思路是这样滴: 1.鸡蛋会不断的从右往左移动: 2.当母鸡快碰到鸡蛋的时候,按下“空格键”让母鸡跳跃起来: 3.如果母鸡落下没碰到鸡蛋,加一分: 4. ...
- (四)resultMap、sql片段与动态SQL
一.resultMap 1.1 为什么要用resultMap resultType:指定输出结果的类型(pojo.简单类型.hashmap),将SQL查询结果映射为Java对象. 使用resultTy ...
- C# 高低位获取
ushort Tbed = 2255; byte gao = (byte)(Tbed >> 8); byte di = (byte)(Tbed & 0xff); ushort a ...
- Linux 数据库MySql 安装配置教程!
本文价绍Linux 相关mysql 安装和配置以及基本连接测试 1官网下载安装mysql-server # wget http://dev.mysql.com/get/mysql-community- ...
- JS基础_函数作用域练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 多态——virtual
作用:解决当使用基类的指针指向派生类的对象并调用派生类中与基类同名的成员函数时会出错(只能访问到基类中的同名的成员函数)的问题,从而实现运行过程的多态 不加virtual #include<io ...
- vs Code编辑器智能提示功能
一.Node.Js的Typings工具可以用于Visual Studio Code的代码补全 1.vscode 的默认只有es原声api带有自动补全的功能,现在V1.9的版本默认已经支持NodeJS的 ...
- 面试题之String s="a"+"b"+"c"+"d";
今天遇到了一个面试题的选择,我当时真的没怎么在意,其实挺好玩的. 1.这条语句String s="a"+"b"+"c"+"d&qu ...
- eclipse调试之edit source lookup path解决方案
转自:https://blog.csdn.net/zkn_CS_DN_2013/article/details/48731133
- Redis面试题记录--缓存双写情况下导致数据不一致问题
转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article ...