ODT错了一个点
查看原帖
ODT错了一个点
722313
Whiking楼主2023/7/23 21:53

RT

#include<bits/stdc++.h>
#define int long long

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;
}
const int N=5e5+100,inf=1e9,MOD=1e9+7;
int n,m;
char str[N],a[N];
struct Chtholly{
	int l,r;
	mutable int val;
	Chtholly(int L,int R=0,int v=0):l(L),r(R),val(v){}
	bool operator<(const Chtholly &rhs)const{return l<rhs.l;}
};
set<Chtholly>s;
auto split(int pos){
	auto it=s.lower_bound(Chtholly(pos));
	if(it!=s.end()&&it->l==pos)return it;
	it--;
	if(it->r<pos)return s.end();
	int l=it->l,r=it->r,v=it->val;
	s.erase(it);
	s.insert(Chtholly(l,pos-1,v));
	return s.insert(Chtholly(pos,r,v)).first;
}
void assign(int l,int r,int x){
	auto itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(Chtholly(l,r,x));
}
string ask(int l,int r){
	auto itr=split(r+1),itl=split(l);
	auto x=prev(itl);
	if(x->val==itr->val)return "No";
	for(auto it=next(itl);it!=itr;it++)if(it->val!=prev(it)->val)return "No";
	return "Yes";
}
signed main(){
	n=read();
	scanf("%s",str+1);
	for(int i=1;i<=n;i++)a[i]=str[i]-'A'+1,s.insert((Chtholly){i,i,a[i]});
	m=read();
	while(m--){
		char op[10],S[10];
		int l,r;
		scanf("%s%lld%lld",op,&l,&r);
		if(op[0]=='A')scanf("%s",S),assign(l,r,S[0]-'A'+1);
		else cout<<ask(l,r)<<endl;
	}
}
2023/7/23 21:53
加载中...