【题解】Luogu P4979 矿洞:坍塌
原题传送门:P4979 矿洞:坍塌
这是某场膜你赛的题,最后我一百零几分rank三十几滚粗
这是我唯一ac的一题
这题比较简单qaq
前置芝士:珂朵莉树
窝博客里对珂朵莉树的介绍
没什么好说的自己看看吧
A操作就assign_val,把区间中的全修改成某个字符
B操作暴力判断,先判断区间的字符内是否相同,再判断左右两端的字符相同
B操作要注意细节,细节见程序qaq
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct node
{
    int l,r;
    mutable char v;
    node(int L, int R=-1, char V=0):l(L), r(R), v(V) {}
    bool operator<(const node& o) const
    {
        return l < o.l;
    }
};
set<node> s;
#define IT set<node>::iterator
IT split(int pos)
{
    IT it = s.lower_bound(node(pos));
    if (it != s.end() && it->l == pos)
        return it;
    --it;
    int L = it->l, R = it->r;
    char V = it->v;
    s.erase(it);
    s.insert(node(L, pos-1, V));
    return s.insert(node(pos, R, V)).first;
}
void assign_val(int l,int r,char v)
{
    IT itr = split(r+1),itl = split(l);
    s.erase(itl, itr);
    s.insert(node(l, r, v));
}
char getc(int pos)
{
    IT it=split(pos);
    return it->v;
}
bool check(int l,int r)
{
    IT itr = split(r+1),itl = split(l);
    char c=itl->v;
    for(;itl!=itr;++itl)
        if(itl->v!=c)
            return false;
    return true;
}
char str[500005];
int main()
{
    int n=read();
    scanf("%s",str+1);
    int cnt=1;
    char last=str[1];
    for(register int i=2;i<=n;++i)
    {
        if(str[i]==last)
            ++cnt;
        else
        {
            s.insert(node(i-cnt,i-1,last));
            last=str[i];
            cnt=1;
        }
    }
    s.insert(node(n+1-cnt,n,last));
    int m=read();
    while(m--)
    {
    	char op=getchar();
    	while(op!='A'&&op!='B')
    		op=getchar();
    	if(op=='A')
    	{
    		int l=read(),r=read();
    		char c=getchar();
    		while(c!='A'&&c!='B'&&c!='C')
    			c=getchar();
    		assign_val(l,r,c);
        }
        else
        {
            int l=read(),r=read();
            if(l==1||l==n||r==1||r==n)
            {
                if(check(l,r))
                    puts("Yes");
                else
                    puts("No");
                continue;
            }
            char b=getc(r+1),a=getc(l-1);
            if(a==b||!check(l,r))
                puts("No");
            else
                puts("Yes");
        }
    }
    return 0;
}
【题解】Luogu P4979 矿洞:坍塌的更多相关文章
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
		[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ... 
- 洛谷P4979 矿洞:坍塌
		洛谷题目链接 珂朵莉树吼啊!!! 又是一道水题,美滋滋~~~ $A$操作完全模板区间赋值 $B$操作也是一个模板查询,具体看代码 注意:读入不要用$cin$,会$T$,如果你是大佬,会玄学东西当我没说 ... 
- 题解 Luogu P2499: [SDOI2012]象棋
		关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ... 
- 题解 luogu P1144 【最短路计数】
		本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ... 
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
		感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ... 
- 题解 Luogu P3370
		讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ... 
- 题解 Luogu P3623 [APIO2008]免费道路
		[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ... 
- [题解]luogu P4116 Qtree3
		终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ... 
- 题解 Luogu P3959 【宝藏】
		来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ... 
随机推荐
- Struts2第三天
			## Struts2第三天 ## ---------- **课程回顾:Struts2框架的第二天** 1. Servlet的API * ActionContext对象 * ServletActionC ... 
- python入门第二篇
			整体注释:ctrl+? 1.运算符 + - * / //(取商) **(幂) %(求余) 判断某个东西是否在某个东西里面包含: in not in 不等于: <& ... 
- 001- CreateProcess failed with error 216 (no message available)错误详解
			问题详解 runnerw.exe: CreateProcess failed with error 216 (no message available) 看描述,创建进程失败,应该是main这个入口文 ... 
- wordpress学习(四)---url伪静态简单了解
			在page-url.php页面做测试 <h2>url伪静态</h2> 接收到的pagename参数是:<? echo $wp_query->query_vars[' ... 
- SiteCore Experience Analytics-体验分析
			体验分析 Sitecore Experience Analytics为营销人员和营销分析师提供仪表板和报告,以识别从其网站和可能的其他外部数据源收集的体验数据的模式和趋势. 体验分析报告示例: ... 
- Python学习记录之-----类
			面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ... 
- QDialog 使用Demo
			[1].pro QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = TestDialog TEMPLATE = ... 
- wingide 远程调试
			1.首先你应该在本地安装wingide 6.1版本 2.大多数电脑.py文件都不能以wingide的形式打开(异常苦逼),无论是从“属性”或者是“设置”里面都不可以,无奈之下只能通过修改注册表的方式进 ... 
- Knowing is not enough; we must apply. Willing is not enough; we must do.
			Knowing is not enough; we must apply. Willing is not enough; we must do. 仅限于知道是不够的,我们必须去实践:单纯的希望是不够的 ... 
- tomcat 、NIO、netty 本质
			tomcat 基于 Socket,面向 web 浏览器的通信容器 nio 同步非阻塞的I/O模型 netty 通信框架,对 nio 的封装 
