珂朵莉树吼啊!!!
又是一道水题,美滋滋~~~
$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; }