题目传送门

色板游戏

题目背景

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

题目描述

色板长度为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:

  1. //It is made by HolseLee on 5th Aug 2018
  2. //Luogu.org P1558
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<algorithm>
  8. #include<iostream>
  9. #include<iomanip>
  10. using namespace std;
  11.  
  12. const int N=1e5+;
  13. int n,m,T,s[N<<2][],sign[N<<2][];
  14.  
  15. inline int read()
  16. {
  17. char ch=getchar();int num=;bool flag=false;
  18. while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
  19. while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
  20. return flag?-num:num;
  21. }
  22.  
  23. inline void pushup(int rt,int col)
  24. {
  25. s[rt][col]=(s[rt<<][col]|s[rt<<|][col]);
  26. }
  27.  
  28. inline void pushdown(int rt,int col)
  29. {
  30. if(sign[rt][col]==-)return;
  31. s[rt<<][col]=sign[rt][col];
  32. s[rt<<|][col]=sign[rt][col];
  33. sign[rt<<][col]=sign[rt][col];
  34. sign[rt<<|][col]=sign[rt][col];
  35. sign[rt][col]=-;
  36. }
  37.  
  38. inline void build(int l,int r,int rt,int col)
  39. {
  40. if(l==r){
  41. s[rt][col]=;return;
  42. }
  43. int mid=(l+r)>>;
  44. build(l,mid,rt<<,col);build(mid+,r,rt<<|,col);
  45. pushup(rt,col);
  46. }
  47.  
  48. inline void update(int l,int r,int rt,int L,int R,int col,int now)
  49. {
  50. if(r<L||l>R)return;
  51. if(L<=l&&r<=R){
  52. s[rt][col]=now;sign[rt][col]=now;
  53. return;
  54. }
  55. int mid=(l+r)>>;
  56. pushdown(rt,col);
  57. if(L<=mid)update(l,mid,rt<<,L,R,col,now);
  58. if(R>mid)update(mid+,r,rt<<|,L,R,col,now);
  59. pushup(rt,col);
  60. }
  61.  
  62. inline int quary(int l,int r,int rt,int L,int R,int col)
  63. {
  64. if(r<L||l>R) return ;
  65. if(L<=l&&r<=R) return s[rt][col];
  66. int mid=(l+r)>>,ret=;
  67. pushdown(rt,col);
  68. if(L<=mid)ret|=quary(l,mid,rt<<,L,R,col);
  69. if(ret==)return ret;
  70. if(R>mid)ret|=quary(mid+,r,rt<<|,L,R,col);
  71. return ret;
  72. }
  73.  
  74. int main()
  75. {
  76. n=read();T=read();m=read();
  77. memset(sign,-,sizeof(sign));
  78. build(,n,,);
  79. char op[];int x,y,z,ans=;
  80. for(int i=;i<=m;++i){
  81. scanf("%s",op);
  82. x=read();y=read();
  83. if(x>y)x^=y,y^=x,x^=y;
  84. if(op[]=='C'){
  85. z=read();
  86. for(int j=;j<=T;++j)
  87. if(j!=z)update(,n,,x,y,j,);
  88. update(,n,,x,y,z,);
  89. }
  90. else {
  91. ans=;
  92. for(int j=;j<=T;++j)
  93. ans+=quary(,n,,x,y,j);
  94. printf("%d\n",ans);
  95. }
  96. }
  97. return ;
  98. }

洛谷P1558 色板游戏 [线段树]的更多相关文章

  1. 洛谷 P1558 色板游戏

    洛谷 题解里面好像都是压位什么的, 身为蒟蒻的我真的不会, 所以就来谈谈我的30颗线段树蠢方法吧! 这题初看没有头绪. 然后发现颜色范围好像只有30: 所以,我就想到一种\(sao\)操作,搞30颗线 ...

  2. 洛谷P1558 色板游戏

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

  3. P1558 色板游戏 (线段树)

    题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...

  4. P1558 色板游戏 线段树+二进制状压

    好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...

  5. P1558 色板游戏 线段树(区间修改,区间查询)

    题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为 ...

  6. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  7. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  8. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  9. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

随机推荐

  1. C语言 结构体传值与传址分析

    /********************************************************************** * 版权所有 (C)2017, Wang maochun ...

  2. HBase基本操作-Java实现

    创建Table public static void createTable(String tableName){ try { HBaseAdmin hbaseAdmin = new HBaseAdm ...

  3. JQ笔记-加强版

    Query初级   一.介绍.基本写法   什么是JQ: 一个优秀的JS库,大型开发必备 JQ的好处: 简化JS的复杂操作 不再需要关心兼容性 提供大量实用方法 如何学习JQ: www.jquery. ...

  4. Do the Untwist(模拟)

    ZOJ Problem Set - 1006 Do the Untwist Time Limit: 2 Seconds      Memory Limit: 65536 KB Cryptography ...

  5. python 常用模块之ConfigParser

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在Python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser, Python C ...

  6. 前端开发必知必会:CSS Position 全解析

    此文根据Steven Bradley的<How Well Do You Understand CSS Positioning?>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之处 ...

  7. 【CodeForces】932 E. Team Work

    [题目]E. Team Work [题意]给定n和k,n个人中选择一个大小为x非空子集的代价是x^k,求所有非空子集的代价和%1e9+7.n<=10^9,k<=5000. [算法]斯特林反 ...

  8. 【BZOJ】2565: 最长双回文串

    [题意]给定小写字母字符串s,求最长的 [ 可以分成左右两个回文串的 ] 子串,n<=10^5. [算法]回文树 [题解]对于每个字符x,处理出以x结尾的最长回文串,以x开头的最长回文串,然后枚 ...

  9. 聊聊spring的那些扩展机制

    1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...

  10. js_网页导出pdf文件

    打印当前页面,一开始我认为是需要输出pdf的,后来了解的需求是能够打印就可以了.需求既然都研究了,记录下. 更好的打印方式,window.print();会弹出打印对话框,打印的是window.doc ...