较为普通的线段树,MnZn求调,悬两关
查看原帖
较为普通的线段树,MnZn求调,悬两关
397689
___Furina___楼主2024/3/20 14:23

自己手写的,Sub 0全Wa,Sub 1全Ac,不知道是思路错了还是写挂了。

#include<bits/stdc++.h>
#define N 500010
#define lt (p<<1)
#define rt (p<<1|1)
#define mid (l+r>>1)
#define I_love_Furina return 
//#define int long long
using namespace std;
int n,T,m;
char ch;
struct node{int tag,x;}a[N<<2];
inline int gt(char ch){
	if(ch=='A')I_love_Furina 1;
	if(ch=='B')I_love_Furina 2;
	if(ch=='C')I_love_Furina 3;
}
inline int pushup(int x,int y){
	if(a[x].x!=a[y].x)return -1;
	else return a[x].x;
}
inline void pushdown(int p){
	if(!a[p].tag)I_love_Furina ;
	a[lt].tag=a[rt].tag=a[lt].x=a[rt].x=a[p].tag;
}
inline void build(int p,int l,int r){
	if(l==r){cin>>ch,a[p].x=gt(ch);I_love_Furina ;}
	build(lt,l,mid),build(rt,mid+1,r),a[p].x=pushup(lt,rt);
}
inline void update(int p,int L,int R,int l,int r,int x){
	if(L<=l&&r<=R)I_love_Furina (void)(a[p].tag=a[p].x=x);
	pushdown(p);
	if(mid>=L)update(lt,L,R,l,mid,x);
	if(mid+1<=R)update(rt,L,R,mid+1,r,x);
	a[p].x=pushup(lt,rt);
}
inline int query(int p,int L,int R,int l,int r){
	if(L<=l&&r<=R)I_love_Furina a[p].x;
	pushdown(p);
	if(mid>=R)I_love_Furina query(lt,L,R,l,mid);
	if(mid+1<=L)I_love_Furina query(rt,L,R,mid+1,r);
	int x=query(lt,L,R,l,mid),y=query(rt,L,R,mid+1,r);
	if(x!=y)I_love_Furina -1;else I_love_Furina x;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	build(1,1,n);
	cin>>m;
	while(m--){
		int l,r;
		cin>>ch>>l>>r;
		char x;
		if(ch=='A')cin>>x,update(1,l,r,1,n,gt(x));
		else {
			if(l-1>=1&&r+1<=n&&query(1,l-1,l-1,1,n)==query(1,r+1,r+1,1,n)||query(1,l,r,1,n)==-1)cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
		}
	}
}

2024/3/20 14:23
加载中...