问题描述

LG4979


题解

珂朵莉树+O2简直就是绝配

对于操作 A ,直接 \(\mathrm{assign}\) 推平就完事了。

对于操作 B ,如果它左右端点有在边界上的,直接把区间 \([l,r]\)撕出来判断就完了,如果不在边界上,先把单点 \({l-1,r+1}\) 撕出来判,如果符合条件,再撕 \([l,r]\) 出来判。


\(\mathrm{Code}\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define IT set<node>::iterator
  4. template <typename Tp>
  5. void read(Tp &x){
  6. x=0;char ch=1;int fh;
  7. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  8. if(ch=='-'){fh=-1;ch=getchar(); }
  9. else fh=1;
  10. while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  11. x*=fh;
  12. }
  13. const int maxn=500007;
  14. struct node{
  15. int l,r;
  16. mutable char v;
  17. node(int L,int R=-1,char V=0):l(L),r(L),v(V){}
  18. bool operator <(node a)const{
  19. return l<a.l;
  20. }
  21. };
  22. char a[maxn];
  23. set<node>s;
  24. IT split(int pos){
  25. IT it=s.lower_bound(node(pos));
  26. if(it!=s.end()&&it->l==pos) return it;
  27. --it;
  28. int L=it->l,R=it->r;char V=it->v;
  29. s.erase(it);s.insert(node(L,pos-1,V));
  30. return s.insert(node(pos,R,V)).first;
  31. }
  32. void assign(int l,int r,char val){
  33. IT rr=split(r+1),ll=split(l);
  34. s.erase(ll,rr);s.insert(node(l,r,val));
  35. }
  36. char gec(int pos){
  37. IT it=split(pos);
  38. return it->v;
  39. }
  40. bool check(int l,int r){
  41. IT rr=split(r+1),ll=split(l);
  42. char k=ll->v;
  43. for(;ll!=rr;++ll) if(ll->v!=k) return false;
  44. return true;
  45. }
  46. int T,x,y,z,n;
  47. char c;
  48. int main(){
  49. read(n);scanf("%s",a+1);
  50. int cnt=1;char las=a[1];
  51. for(int i=2;i<=n;i++){
  52. if(a[i]==las) ++cnt;
  53. else{
  54. s.insert(node(i-cnt,i-1,las));las=a[i],cnt=1;
  55. }
  56. }
  57. s.insert(node(n+1-cnt,n,las));
  58. read(T);
  59. while(T--){
  60. cin>>c;int op=c-'A'+1;
  61. if(op==1){char z;
  62. read(x);read(y);cin>>z;
  63. assign(x,y,z);
  64. }
  65. else{
  66. read(x);read(y);
  67. if(x==1||x==n||y==1||y==n){
  68. if(check(x,y)) puts("Yes");
  69. else puts("No");
  70. }
  71. else{
  72. int aa=gec(x-1),bb=gec(y+1);
  73. if(aa==bb||!check(x,y)) puts("No");
  74. else puts("Yes");
  75. }
  76. }
  77. }
  78. return 0;
  79. }

LG4979 矿洞:坍塌 珂朵莉树的更多相关文章

  1. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  2. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  3. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

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

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

  5. 洛谷P2082 区间覆盖(加强版)(珂朵莉树)

    传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...

  6. 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)

    传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...

  7. CF915E Physical Education Lessons(珂朵莉树)

    中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...

  8. CF896C Willem, Chtholly and Seniorious(珂朵莉树)

    中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...

  9. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

随机推荐

  1. day94_11_26爬虫find与findall

    一.使用json 正常的,如果需要将response结果序列化,需要将结果json.loads res1=json.loads(response.text) 但是这样会很麻烦,request提供了js ...

  2. You Are Given a Decimal String... CodeForces - 1202B [简单dp][补题]

    补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...

  3. 集成Hive和HBase

    1. MapReduce 用MapReduce将数据从本地文件系统导入到HBase的表中, 比如从HBase中读取一些原始数据后使用MapReduce做数据分析. 结合计算型框架进行计算统计查看HBa ...

  4. 模块基础实战之ATM和购物车系统分文件处理

    目录 一.项目地址 二.功能需求 一.项目地址 https://github.com/nickchen121/atm 二.功能需求 FUNC_MSG = { '0': '注销', '1': '登录', ...

  5. React Hooks用法大全

    前言 在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖 ...

  6. python request获取ip、获取登录设备

    from flask import request 获取ip request.remote_addr 获取登录设备 request.user_agent.string

  7. Feign、httpclient、OkHttp3 结合使用

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈 正在进行分布式和高并发基础原理 的研习,比如下面的一些基础性的内容: 一.Netty Redis 亿级流量 ...

  8. 安装 Java

    1.rpm下载地址 https://download.oracle.com/otn/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm?AuthParam=1570520 ...

  9. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  10. SpringBoot开发案例之mail中文附件名字乱码

    最近在开发一个邮件发送多附件的微服务,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSender 但是发送出来的附件 ...