原题传送门:P2787 语文1(chin1)- 理理思维

前置芝士:珂朵莉树

窝博客里对珂朵莉树的介绍

没什么好说的自己看看吧

珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快

操作1:暴力统计出奇迹

操作2:推平区间,珂朵莉树基本操作

操作3:排序区间,我就写了一个桶排

窝一开始头文件直接用bits出玄学ce

toupper是把小写转大写,以防数据出锅

  1. #pragma GCC optimize("O3")
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<set>
  6. #define IT set<node>::iterator
  7. using namespace std;
  8. inline int read()
  9. {
  10. register int x=0,f=1;register char ch=getchar();
  11. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  13. return x*f;
  14. }
  15. struct node
  16. {
  17. int l,r;
  18. mutable char v;
  19. node(int L, int R=-1, char V=0):l(L), r(R), v(V) {}
  20. bool operator<(const node& o) const
  21. {
  22. return l < o.l;
  23. }
  24. };
  25. set<node> s;
  26. IT split(int pos)
  27. {
  28. IT it = s.lower_bound(node(pos));
  29. if (it != s.end() && it->l == pos)
  30. return it;
  31. --it;
  32. int L = it->l, R = it->r;
  33. char V = it->v;
  34. s.erase(it);
  35. s.insert(node(L, pos-1, V));
  36. return s.insert(node(pos, R, V)).first;
  37. }
  38. int count(int l,int r,char v)
  39. {
  40. IT itr = split(r+1) ,itl = split(l);
  41. int ans=0;
  42. for( ; itl != itr ; ++itl)
  43. if(itl->v == v)
  44. ans+=itl->r-itl->l+1;
  45. return ans;
  46. }
  47. void assign_val(int l,int r,char v)
  48. {
  49. IT itr = split(r+1),itl = split(l);
  50. s.erase(itl, itr);
  51. s.insert(node(l, r, v));
  52. }
  53. void sort_val(int l,int r)
  54. {
  55. int cnt[27];
  56. memset(cnt,0,sizeof(cnt));
  57. IT itr = split(r+1), itl = split(l), it = itl;
  58. for( ; itl != itr ; ++itl)
  59. cnt[itl->v-'A']+=itl->r-itl->l+1;
  60. s.erase(it,itr);
  61. for(register int i=0;i<26;++i)
  62. if(cnt[i])
  63. {
  64. s.insert(node(l,l+cnt[i]-1,i+'A'));
  65. l+=cnt[i];
  66. }
  67. }
  68. char str[50005];
  69. int main()
  70. {
  71. int n=read(),m=read();
  72. scanf("%s",str+1);
  73. int cnt=1;
  74. char last=toupper(str[1]);
  75. for(register int i=2;i<=n;++i)
  76. {
  77. str[i]=toupper(str[i]);
  78. if(str[i]==last)
  79. ++cnt;
  80. else
  81. {
  82. s.insert(node(i-cnt,i-1,last));
  83. last=str[i];
  84. cnt=1;
  85. }
  86. }
  87. s.insert(node(n+1-cnt,n,last));
  88. while(m--)
  89. {
  90. int opt=read(),l=read(),r=read();
  91. char dic[5];
  92. if(opt==1)
  93. {
  94. scanf("%s",dic);
  95. printf("%d\n",count(l,r,toupper(dic[0])));
  96. }
  97. else if(opt==2)
  98. {
  99. scanf("%s",dic);
  100. assign_val(l,r,toupper(dic[0]));
  101. }
  102. else
  103. sort_val(l,r);
  104. }
  105. return 0;
  106. }

【题解】Luogu P2787 语文1(chin1)- 理理思维的更多相关文章

  1. [luogu] P2787 语文1(chin1)- 理理思维(分块)

    P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...

  2. P2787 语文1(chin1)- 理理思维

    P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我 ...

  3. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  4. 洛谷 P2787 语文1(chin1)- 理理思维

    题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 ...

  5. 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)

    传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...

  6. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  7. 洛谷P2787 语文1(chin1)- 理理思维

    洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代 ...

  8. 题解【语文1(chin1)- 理理思维】

    link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #inclu ...

  9. Luogu 1031 - 均分纸牌 - [有意思的思维题]

    题目链接:https://www.luogu.org/problemnew/show/P1031 题目描述有 $N$ 堆纸牌,编号分别为 $1,2,…,N$.每堆上有若干张,但纸牌总数必为 $N$ 的 ...

随机推荐

  1. 带上RESTful的金手铐,你累吗?

    1. 首先RESTful是一套规范,不是框架,它是来约束你的.也不关心生产效率的提高.就好像使用汇编开发应用,性能是快了,但是生产效率很低.RESTful它需要你在路由上定义很多规则来解释的URL,假 ...

  2. MySQL数据类型--与MySQL零距离接触2-5字符型

    CHAR(5) : 存储abc时,由于长度不够,所以abc后面会补充2个空格,也就是abc CHAR 0-255字节 定长字符串 VARCHAR 0-65535 字节 变长字符串 ENUM('valu ...

  3. MyBatis基础入门《十 一》修改数据

    MyBatis基础入门<十 一>修改数据 实体类: 接口类: xml文件: 测试类: 测试结果: 数据库: 如有问题,欢迎纠正!!! 如有转载,请标明源处:https://www.cnbl ...

  4. Vuejs核心思想学习笔记

    习Vue已经有一段时间了,但未对其核心思想作自己的总结和理解 Vue核心思想有两个 : 数据驱动和组件化(系统组件) 数据驱动 数据驱动目的是让数据和DOM保持同步, 只要修改了data数据,DOM就 ...

  5. 删掉centos原有的openjdk并安装sun jdk

    [环境变量]删掉centos原有的openjdk并安装sun jdk   一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e ...

  6. Unity3d之表情动画--眨眼

    可通过BlendShape来实现眨眼动画,效果如下: 转载请注明出处:http://www.cnblogs.com/jietian331/p/7054673.html 代码如下: using Unit ...

  7. Beta阶段冲刺2.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 "我的活动详情&quo ...

  8. python自定义安装包

    python的第三方模块越来越丰富,涉及的领域也非常广,如科学计算.图片处理.web应用.GUI开发等.当然也可以将自己写的模块进行打包或发布.一简单的方法是将你的类包直接copy到python的li ...

  9. nw.js package一般设置

    { "name": "app name", "main": "mainpage",                    ...

  10. hdu5293 lca+dp+树状数组+时间戳

    题意是给了 n 个点的树,会有m条链条 链接两个点,计算出他们没有公共点的最大价值,  公共点时这样计算的只要在他们 lca 这条链上有公共点的就说明他们相交 dp[i]为这个点包含的子树所能得到的最 ...