洛谷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:
//It is made by HolseLee on 5th Aug 2018
//Luogu.org P1558
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<iomanip>
using namespace std; const int N=1e5+;
int n,m,T,s[N<<2][],sign[N<<2][]; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void pushup(int rt,int col)
{
s[rt][col]=(s[rt<<][col]|s[rt<<|][col]);
} inline void pushdown(int rt,int col)
{
if(sign[rt][col]==-)return;
s[rt<<][col]=sign[rt][col];
s[rt<<|][col]=sign[rt][col];
sign[rt<<][col]=sign[rt][col];
sign[rt<<|][col]=sign[rt][col];
sign[rt][col]=-;
} inline void build(int l,int r,int rt,int col)
{
if(l==r){
s[rt][col]=;return;
}
int mid=(l+r)>>;
build(l,mid,rt<<,col);build(mid+,r,rt<<|,col);
pushup(rt,col);
} inline void update(int l,int r,int rt,int L,int R,int col,int now)
{
if(r<L||l>R)return;
if(L<=l&&r<=R){
s[rt][col]=now;sign[rt][col]=now;
return;
}
int mid=(l+r)>>;
pushdown(rt,col);
if(L<=mid)update(l,mid,rt<<,L,R,col,now);
if(R>mid)update(mid+,r,rt<<|,L,R,col,now);
pushup(rt,col);
} inline int quary(int l,int r,int rt,int L,int R,int col)
{
if(r<L||l>R) return ;
if(L<=l&&r<=R) return s[rt][col];
int mid=(l+r)>>,ret=;
pushdown(rt,col);
if(L<=mid)ret|=quary(l,mid,rt<<,L,R,col);
if(ret==)return ret;
if(R>mid)ret|=quary(mid+,r,rt<<|,L,R,col);
return ret;
} int main()
{
n=read();T=read();m=read();
memset(sign,-,sizeof(sign));
build(,n,,);
char op[];int x,y,z,ans=;
for(int i=;i<=m;++i){
scanf("%s",op);
x=read();y=read();
if(x>y)x^=y,y^=x,x^=y;
if(op[]=='C'){
z=read();
for(int j=;j<=T;++j)
if(j!=z)update(,n,,x,y,j,);
update(,n,,x,y,z,);
}
else {
ans=;
for(int j=;j<=T;++j)
ans+=quary(,n,,x,y,j);
printf("%d\n",ans);
}
}
return ;
}
洛谷P1558 色板游戏 [线段树]的更多相关文章
- 洛谷 P1558 色板游戏
洛谷 题解里面好像都是压位什么的, 身为蒟蒻的我真的不会, 所以就来谈谈我的30颗线段树蠢方法吧! 这题初看没有头绪. 然后发现颜色范围好像只有30: 所以,我就想到一种\(sao\)操作,搞30颗线 ...
- 洛谷P1558 色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有 ...
- P1558 色板游戏 (线段树)
题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...
- 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]的颜色种类 思路: 因为 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
随机推荐
- expect 批量增加用户及配置密码
start.sh #!/bin/bash password="111111" username="test" if [ $# == 1 ] then usern ...
- Spring 与 SpringMVC 容器父子关系引出的相应问题
1)关系说明 spring 与 springmvc 父子关系:spring (父容器),springmvc (子容器) springmvc(子)--- 可调用 --> spring(父) 中的 ...
- Idea工具常用技巧总结
转自:https://www.jianshu.com/p/131c2deb3ecf Idea常用技巧总结 1.无处不在的跳转 注:这里的快捷键是自己定义的,并非大家的都一样,可以通过findActio ...
- NOIP模拟赛16
NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2 期望得分:100+100+ =200+ 实际得分:100+40+70=210 T1天天寄快递 直接模拟,代码丢了...... T2天天和不 ...
- 几何+思维 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest K. Revenge of the Dragon
题目链接:http://codeforces.com/gym/101149/problem/K 题目大意: 给你两个点a,b.一个人在a点,一个人在b点,b点的人要追杀a的点,他的跑步速度是a的两倍. ...
- HDU 4990 Reading comprehension 简单矩阵快速幂
Problem Description Read the program below carefully then answer the question.#pragma comment(linker ...
- My latest news(--2016.12.31)
2016.12.31 前一天晚上看 “纪实新闻” ,白天看视频,晚上刷题,看电影<湄公河行动> 2016.12.30 18:36 昨天上午考完了本学期的最后一门课程,下午乒乓+值班,今天 ...
- C++ 的getline问题
在用c++的getline函数的时候碰到两个问题,总结如下: 1.有时候写程序的时候我们会发现getline(cin,str);这样的语句是不会执行,而是直接跳过的, 一般的解决方法是getline一 ...
- java-jdbc-mysql:实现数据库表的增删改查
以数据库test下数据表student(sno,sname,ssex,sage,sdept)为例: student表中的已有的所有记录:
- 【最大流】【CODEVS】1993 草地排水
[算法]网络流-最大流(dinic) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html #include<cstdio> #includ ...