洛谷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 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
随机推荐
- C语言 结构体传值与传址分析
/********************************************************************** * 版权所有 (C)2017, Wang maochun ...
- HBase基本操作-Java实现
创建Table public static void createTable(String tableName){ try { HBaseAdmin hbaseAdmin = new HBaseAdm ...
- JQ笔记-加强版
Query初级 一.介绍.基本写法 什么是JQ: 一个优秀的JS库,大型开发必备 JQ的好处: 简化JS的复杂操作 不再需要关心兼容性 提供大量实用方法 如何学习JQ: www.jquery. ...
- Do the Untwist(模拟)
ZOJ Problem Set - 1006 Do the Untwist Time Limit: 2 Seconds Memory Limit: 65536 KB Cryptography ...
- python 常用模块之ConfigParser
在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在Python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser, Python C ...
- 前端开发必知必会:CSS Position 全解析
此文根据Steven Bradley的<How Well Do You Understand CSS Positioning?>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之处 ...
- 【CodeForces】932 E. Team Work
[题目]E. Team Work [题意]给定n和k,n个人中选择一个大小为x非空子集的代价是x^k,求所有非空子集的代价和%1e9+7.n<=10^9,k<=5000. [算法]斯特林反 ...
- 【BZOJ】2565: 最长双回文串
[题意]给定小写字母字符串s,求最长的 [ 可以分成左右两个回文串的 ] 子串,n<=10^5. [算法]回文树 [题解]对于每个字符x,处理出以x结尾的最长回文串,以x开头的最长回文串,然后枚 ...
- 聊聊spring的那些扩展机制
1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...
- js_网页导出pdf文件
打印当前页面,一开始我认为是需要输出pdf的,后来了解的需求是能够打印就可以了.需求既然都研究了,记录下. 更好的打印方式,window.print();会弹出打印对话框,打印的是window.doc ...