萌新 ODT 求调教(悬关)
查看原帖
萌新 ODT 求调教(悬关)
1145602
dongzhenmao楼主2024/9/26 13:48

记录: link

#include <stdio.h>
#include <ctype.h>
#include <algorithm>
#include <string.h>
#include <set>
#define lnt long long
#define inf 0x3f3f3f3f
using namespace std;
int xx;char ff,chh;inline int read(){
    xx=ff=0;while(!isdigit(chh)){if(chh=='-'){ff=1;}chh=getchar();}
    while(isdigit(chh)){xx=(xx<<1)+(xx<<3)+chh-'0';chh=getchar();}return ff? -xx: xx;
}
char chc;char gc(){chc=getchar();if(chc==10 || chc=='\r' || chc==' '){chc=getchar();}return chc;}
const int N=2e3;
struct node{
	int l,r;mutable char v;
	node(int _l,int _r=-1,char _v=0):l(_l),r(_r),v(_v){}
	bool friend operator <(const node &v,const node &u){return v.l<u.l;}
};
#define It set<node>::iterator
set<node> s;
int n;
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 change(int l,int r,char v){
	It itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,v));
}
bool check(int l,int r){
	It itr=split(r+1),itl=split(l);
	if(l!=1 && r!=n){
		It templ=--itl;itl++;
		if((templ)->v==(itr)->v){return false;}
	}
	char v=itl->v;
	for(It it=++itl;it!=itr;++it){if(it->v!=v){return false;}}
	return true;
}
int main(){
	n=read();
	for(int i=1;i<=n;++i){
		change(i,i,gc());
	}
	int G=read();
	while(G--){
		char t=gc();
		if(t=='A'){
			int l=read(),r=read();
			change(l,r,gc());
		}else{
			int l=read(),r=read();
			puts(check(l,r)? "Yes": "No");
		}
	}
	
    return 0;
}
2024/9/26 13:48
加载中...