zoukankan      html  css  js  c++  java
  • 【题解】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;
    }
    
  • 相关阅读:
    filp_open/filp_close/vfs_read/vfs_write
    memcpy一种实现方法
    memset函数的实现&printf函数几种输出格式的输出结果
    break退出循环分析
    定义指针变量作为返回值函数执行时报 段错误(核心已转储)
    node实现防盗链
    js实现输入密码之延迟星号和点击按钮显示或隐藏
    rem适配
    使用字蛛教程以及遇到的bug
    es6学习笔记-proxy对象
  • 原文地址:https://www.cnblogs.com/yzhang-rp-inf/p/9904283.html
Copyright © 2011-2022 走看看