洛谷P4979 矿洞:坍塌

洛谷题目链接

珂朵莉树吼啊!!!

又是一道水题,美滋滋~~~

$A$操作完全模板区间赋值

$B$操作也是一个模板查询,具体看代码

注意:读入不要用$cin$,会$T$,如果你是大佬,会玄学东西当我没说

代码:

#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#define N 500007
#define Set set<Node>::iterator
using namespace std;
struct Node
{
    int l,r;
    mutable char val;
    Node(int L,int R,char V):l(L),r(R),val(V){}
    Node(int L):l(L){}
    bool operator < (const Node &it)const
    {
        return l<it.l;
    }
};
set<Node> st;
int n,m;
#define isupper(x) ((x) >= 'A' && (x) <= 'Z')
inline char rchar() {
    char c = getchar();
    while (!isupper(c)) c = getchar();
    return c;
}
Set Split(int x)
{
    Set it=st.lower_bound(Node(x));
    if(it!=st.end()&&it->l==x)
        return it;
    --it;
    int L=it->l,R=it->r;
    char V=it->val;
    st.erase(it);
    st.insert(Node(L,x-1,V));
    return st.insert(Node(x,R,V)).first;
}
void Change(int l,int r,char v)
{
    Set rr=Split(r+1),ll=Split(l);
    st.erase(ll,rr);
    st.insert(Node(l,r,v));
}
bool Search(int l,int r)
{
    Set rr=Split(r+1),ll=Split(l);
    char now=ll->val;
    ++ll;
    for(Set it=ll;it!=rr;++it)
        if(it->val!=now)
            return 0;
    return 1;
}
bool Ok(int l,int r)
{
    Set rr=Split(r+1),ll=Split(l);
    --ll;
    if(ll->val==rr->val)
        return 0;
    else
        return 1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        char in;
        in=rchar();
        st.insert(Node(i,i,in));
    }
    st.insert(Node(n+1));
    scanf("%d",&m);
    for(int i=1;i<=m;++i)
    {
        char opt,v;
        int x,y;
        opt=rchar();
        scanf("%d%d",&x,&y);
        if(opt=='A')
        {
            v=rchar();
            Change(x,y,v);
        }
        else
        {
            if(Search(x,y))
            {
                if(x==1||y==n)
                {
                    printf("Yes
");
                }
                else
                {
                    if(Ok(x,y))
                        printf("Yes
");
                    else
                        printf("No
");	
                }
            }
            else
                printf("No
");
        }		
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/yexinqwq/p/10208792.html