萌新求调珂朵莉树
查看原帖
萌新求调珂朵莉树
600442
DreamSoarUpward楼主2022/12/27 13:42

学了一下模板,照着 CSDN 一篇题解打的。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
string a;
struct node{
	int l,r;
	mutable char v;
	const bool operator<(const node &a)const{
		return l<a.l;
	}
};
set<node >s;
set<node >::iterator split(int pos){
	set<node >::iterator it=s.lower_bound({pos});
	if(it!=s.end()&&it->l==pos)
		return it;
	it--;
	if(it->r<pos)
		return s.end();
	int l=it->l;
	int r=it->r;
	char v=it->v;
	s.erase(it);
	s.insert({l,pos-1,v});
	return s.insert({pos,r,v}).first;
}
void assign(int l,int r,char k){
	set<node >::iterator itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert({l,r,k});
}
void query(int l,int r){
	set<node >::iterator itr=split(r+1),itl=split(l);
	if(l!=r){
		set<node >::iterator it=itl,last=itl;
		it++;
		for(;it!=itr;it++,last++)
			if(it->v!=last->v){
				puts("No");
				int _l=itl->l;
				int _r=last->r;
				char _v=last->v;
				s.erase(itl,it);
				s.insert({_l,_r,_v});
				return ;
			}
	}
	char _v=itl->v;
	s.erase(itl,itr);
	s.insert({l,r,_v});
	if(l==1||r==n){
		puts("Yes");
		return ;
	}
	set<node >::iterator ib=split(r+1),ia=split(l-1);
	puts((ia->v!=ib->v)?"Yes":"No");
}
signed main(){
	scanf("%lld\n",&n);
	cin>>a;
	for(int i=1;i<=n;i++){
		int l=i;
		int r=i;
		while(a[l]==a[i])
			r=++i;
		s.insert({l,r,a[--i]});
	}
	scanf("%lld\n",&q);
	while(q--){
		int l,r;
		char op,k;
		scanf("%c",&op);
		if(op=='A'){
			scanf("%lld %lld %c\n",&l,&r,&k);
			assign(l,r,k);
		}
		else{
			scanf("%lld %lld",&l,&r);
			query(l,r);
		}
	}
	return 0;
}
2022/12/27 13:42
加载中...