RE求调
查看原帖
RE求调
787424
Capoien_xie_bei_Chen楼主2023/10/24 20:37
#include<bits/stdc++.h>
#define ls k<<1
#define rs k<<1|1
using namespace std;
int tt;
int n,m;
char s[200005];
struct segment{
	int L,R,sum,lazy;
	int sL[2],sR[2];
	#define L(k) seg[k].L
	#define R(k) seg[k].R
	#define sum(k) seg[k].sum
	#define lazy(k) seg[k].lazy
	#define sL(k,x) seg[k].sL[x]
	#define sR(k,x) seg[k].sR[x]
}seg[1000005];
void print(segment ans){
	if(ans.sum) cout<<"NO\n";
	else cout<<"YES\n";
}
int num(char ch){
	return ch-'a';
}
segment operator +(segment x,segment y){
	segment now;
	now.L=x.L,now.R=y.R;
	if(now.R-now.L<=2){
		now.sL[0]=num(s[now.L]),now.sL[1]=num(s[now.L+1]);
		now.sR[0]=num(s[now.R]),now.sR[1]=num(s[now.R-1]);
		if(s[now.L]==s[now.R]) now.sum=1;
		else now.sum=0;
		return now;
	}
	now.sL[0]=x.sL[0],now.sL[1]=x.sL[1];
	now.sR[0]=y.sR[0],now.sR[1]=y.sR[1];
	now.sum=x.sum|y.sum;
	if(x.sR[0]==y.sL[0]) now.sum=1;
	if(x.sR[0]==y.sL[1]) now.sum=1;
	if(x.sR[1]==y.sL[0]) now.sum=1;
	return now;
}
void pushdown(int k){
	if(lazy(k)){
		sL(ls,0)=(sL(ls,0)+lazy(k))%26;
		sL(ls,1)=(sL(ls,1)+lazy(k))%26;
		sR(ls,0)=(sR(ls,0)+lazy(k))%26;
		sR(ls,1)=(sR(ls,1)+lazy(k))%26;
		sL(rs,0)=(sL(rs,0)+lazy(k))%26;
		sL(rs,1)=(sL(rs,1)+lazy(k))%26;
		sR(rs,0)=(sR(rs,0)+lazy(k))%26;
		sR(rs,1)=(sR(rs,1)+lazy(k))%26;
		lazy(ls)=(lazy(ls)+lazy(k))%26;
		lazy(rs)=(lazy(rs)+lazy(k))%26;
		lazy(k)=0;
	}
}
void build(int k,int l,int r){
	L(k)=l,R(k)=r;
	if(l==r){sum(k)=0;return;}
	int mid=(l+r)>>1;
	cout<<l<<" "<<r<<"\n";
	build(ls,l,mid);
	build(rs,mid+1,r);
	seg[k]=seg[ls]+seg[rs];
}
void add(int k,int l,int r,int x){
	if(L(k)>r||R(k)<l) return;
	if(L(k)>=l&&R(k)<=r){
		sL(k,0)=(sL(k,0)+x)%26;
		sL(k,1)=(sL(k,1)+x)%26;
		sR(k,0)=(sR(k,0)+x)%26;
		sR(k,1)=(sR(k,1)+x)%26;
		lazy(k)=(lazy(k)+x)%26;
		return;
	}
	pushdown(k);
	add(ls,l,r,x);
	add(rs,l,r,x);
	seg[k]=seg[ls]+seg[rs];
}
segment ask(int k,int l,int r){
	if(L(k)>r||R(k)<l){
		segment now;
		now.sum=0;
		return now;
	}
	pushdown(k);
	if(L(k)>=l&&R(k)<=r) return seg[k];
	return ask(ls,l,r)+ask(rs,l,r);
}
void solve(){
	cin>>n>>m;
	cin>>(s+1);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,l,r,x;
		cin>>op;
		if(op&1){
			cin>>l>>r>>x;
			x%=26;
			if(x) add(1,l,r,x);
		}else{
			cin>>l>>r;
			print(ask(1,l,r));
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>tt;
	while(tt--) solve();
	return 0;
} 
2023/10/24 20:37
加载中...