洛谷

题解里面好像都是压位什么的,

身为蒟蒻的我真的不会,

所以就来谈谈我的30颗线段树蠢方法吧!

这题初看没有头绪。

然后发现颜色范围好像只有30;

所以,我就想到一种\(sao\)操作,搞30颗线段树。

每颗线段树代表一种颜色。

那么对于题中的两种操作:

1.修改。我们for循环扫一遍所有颜色,把其他颜色的线段树l->r修改成0,要修

改的颜色所对应的线段树改成1。

2.询问。也是for循环,如果\(l->r\)这个区间的第k种颜色所对应的线段树有值,则\(ans++\)。

时间复杂度也很低,大概是\((MLlog(L)*T)\),真正的\(O(\)卡时\()\).

献上代码:

  1. #include <bits/stdc++.h>
  2. #define ll(x) ((x)<<1)
  3. #define rr(x) ((x)<<1|1)
  4. using namespace std;
  5. const int T=31,N=100010;
  6. int n,t,m;
  7. int laz[T][N<<2],sum[T][N<<2];
  8. void pushup(int i,int x)
  9. {
  10. sum[i][x]=sum[i][ll(x)]+sum[i][rr(x)];
  11. }
  12. void build(int i,int x,int l,int r)
  13. {
  14. if (l==r) {
  15. sum[i][x]=1;
  16. return;
  17. }
  18. int mid=l+r>>1;
  19. build(i,ll(x),l,mid);
  20. build(i,rr(x),mid+1,r);
  21. pushup(i,x);
  22. }
  23. void pushdown(int i,int x)
  24. {
  25. if (laz[i][x]==-1) {
  26. sum[i][ll(x)]=sum[i][rr(x)]=0;
  27. laz[i][ll(x)]=laz[i][rr(x)]=-1;
  28. }
  29. else {
  30. sum[i][ll(x)]=sum[i][rr(x)]=laz[i][x];
  31. laz[i][ll(x)]=laz[i][rr(x)]=laz[i][x];
  32. }
  33. laz[i][x]=0;
  34. }
  35. void change(int i,int x,int l,int r,int ls,int rs,int v)
  36. {
  37. if (l>rs||r<ls) return;
  38. if (l>=ls&&r<=rs) {
  39. sum[i][x]=v;
  40. if (!v) laz[i][x]=-1;
  41. else laz[i][x]=v;
  42. return;
  43. }
  44. if (laz[i][x]) pushdown(i,x);
  45. int mid=l+r>>1;
  46. if (ls<=mid) change(i,ll(x),l,mid,ls,rs,v);
  47. if (rs>mid) change(i,rr(x),mid+1,r,ls,rs,v);
  48. pushup(i,x);
  49. }
  50. int ask(int i,int x,int l,int r,int ls,int rs)
  51. {
  52. if (l>rs||r<ls) return 0;
  53. if (l>=ls&&r<=rs) return sum[i][x];
  54. if (laz[i][x]) pushdown(i,x);
  55. int mid=l+r>>1;
  56. return ask(i,ll(x),l,mid,ls,rs)+ask(i,rr(x),mid+1,r,ls,rs);
  57. }
  58. int main()
  59. {
  60. cin>>n>>t>>m;
  61. build(1,1,1,n);
  62. char s[3];int l,r,v;
  63. for (int i=1;i<=m;++i) {
  64. scanf("%s%d%d",s,&l,&r);
  65. if (l>r) swap(l,r);
  66. if (s[0]=='C') {
  67. scanf("%d",&v);
  68. for (int k=1;k<=t;++k)
  69. if (k!=v)
  70. change(k,1,1,n,l,r,0);
  71. else change(k,1,1,n,l,r,1);
  72. }
  73. else {
  74. int ans=0;
  75. for (int k=1;k<=t;++k)
  76. if (ask(k,1,1,n,l,r))
  77. ++ans;
  78. printf("%d\n",ans);
  79. }
  80. }
  81. return 0;
  82. }

洛谷 P1558 色板游戏的更多相关文章

  1. 洛谷P1558 色板游戏 [线段树]

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

  2. 洛谷P1558 色板游戏

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

  3. P1558 色板游戏 状压线段树

    P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...

  4. P1558 色板游戏

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

  5. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  6. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  7. AC日记——色板游戏 洛谷 P1558

    色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tre ...

  8. 洛谷 P1000 超级玛丽游戏

    P1000 超级玛丽游戏 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级 ...

  9. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

随机推荐

  1. 有效的web安全信息源

    杂志:hackcto ,书安 乌云知识库,91ri.org,安全脉搏(http://www.secpulse.com/) 乌云公开漏洞,乌云热点漏洞,90sec 内网渗透找90.web注入找习科, 已 ...

  2. How to Handle Exception

  3. Vector的一种实现(一)

    注意几点: 分配内存不要使用new和delete,因为new的同时就把对象构造了,而我们需要的是原始内存. 所以应该使用标准库提供的allocator类来实现内存的控制.当然也可以重载operator ...

  4. nonlocal(非局部变量)---python 3.x 新增关健词

    Python里只有2种作用域:全局作用域和局部作用域.全局作用域是指当前代码所在模块的作用域,局部作用域是指当前函数或方法所在的作用域.其实准确来说,Python 3.x引入了nonlocal关键字, ...

  5. lodash 展平数组 flatten flattenDeep

    _.flatten(array) 向上一级展平数组嵌套 <!DOCTYPE html> <html lang="zh"> <head> < ...

  6. 02-2设置第一启动项--进入Bios界面设置U盘为第一启动项

    进入Bios界面设置U盘为第一启动项: 开机,当电脑处于启动状态,屏幕显示电脑LOGO时,按下F2键.(根据电脑的不同,进入BIOS的功能键也不同,可根据自己电脑的型号百度搜索相关功能键) 按电脑方向 ...

  7. Docker: devicemapper fix for “device or resource busy” (EBUSY) Cannot start container

    受众:本文适用于熟悉码头工作的人员,并希望解决使用devicemapper存储/图形驱动程序时遇到的特定问题. 概述:虽然这不是专门用于设计师的问题,但是目前参与此驱动程序的技术人员会受到此影响. 使 ...

  8. matlab 常用函数汇总

    1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 Na ...

  9. ASP.NET CORE RAZOR :向 Razor 页面添加验证

    https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/validation 本部分中向 Movie 模型添加了验证逻辑. ...

  10. MySQL 查询 数据库有多少表 表名是哪些

    1.查询sjcenter数据库里开头为sj_demo和sj_onlyinv的所有表的总条数 select sum(table_rows) from (select table_name,table_r ...