LG4979 矿洞:坍塌 珂朵莉树

问题描述

LG4979


题解

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

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

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


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

#define IT set<node>::iterator

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){fh=-1;ch=getchar(); }
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=500007;

struct node{
    int l,r;
    mutable char v;
    node(int L,int R=-1,char V=0):l(L),r(L),v(V){}
    bool operator <(node a)const{
        return l<a.l;
    }
};

char a[maxn];
set<node>s;

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(int l,int r,char val){
    IT rr=split(r+1),ll=split(l);
    s.erase(ll,rr);s.insert(node(l,r,val));
}

char gec(int pos){
    IT it=split(pos);
    return it->v;
}

bool check(int l,int r){
    IT rr=split(r+1),ll=split(l);
    char k=ll->v;
    for(;ll!=rr;++ll) if(ll->v!=k) return false;
    return true;
}

int T,x,y,z,n;
char c;
int main(){
    read(n);scanf("%s",a+1);
    int cnt=1;char las=a[1];
    for(int i=2;i<=n;i++){
        if(a[i]==las) ++cnt;
        else{
            s.insert(node(i-cnt,i-1,las));las=a[i],cnt=1;
        }
    }
    s.insert(node(n+1-cnt,n,las));
    read(T);
    while(T--){
        cin>>c;int op=c-'A'+1;
        if(op==1){char z;
            read(x);read(y);cin>>z;
            assign(x,y,z);
        }
        else{
            read(x);read(y);
            if(x==1||x==n||y==1||y==n){
                if(check(x,y)) puts("Yes");
                else puts("No");
            }
            else{
                int aa=gec(x-1),bb=gec(y+1);
                if(aa==bb||!check(x,y)) puts("No");
                else puts("Yes");
            }
        }
    }
    return 0;
}
全部评论

相关推荐

躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务