求助为啥CE
查看原帖
求助为啥CE
787424
Capoien_xie_bei_Chen楼主2023/10/24 20:18
#include<bits/stdc++.h>
using namespace std;
#define ls k<<1
#define rs k<<1|1
#define pushup(k) seg[k]=seg[ls]+seg[rs]
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];
segment operator +(segment x,segment y){
	segment k;
	L(k)=L(ls),R(k)=R(rs);
	if(R(k)-L(k)<=2){
		sL(k,0)=num(s[L(k)]),sL(k,1)=num(s[L(k)+1]);
		sR(k,0)=num(s[R(k)]),sR(k,1)=num(s[R(k)-1]);
		if(s[L(k)]==s[R(k)]) sum(k)=1;
		else sum(k)=0;
		return k;
	}
	sL(k,0)=sL(ls,0),sL(k,1)=sL(ls,1);
	sR(k,0)=sR(rs,0),sR(k,1)=sR(rs,1);
	sum(k)=sum(ls)|sum(rs);
	if(sR(ls,0)==sL(rs,0)) sum(k)=1;
	if(sR(ls,0)==sL(rs,1)) sum(k)=1;
	if(sR(ls,1)==sL(rs,0)) sum(k)=1;
	return k;
}
void print(int ans){
	if(ans) cout<<"NO\n";
	else cout<<"YES\n";
}
int num(char ch){
	return ch-'a';
}
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) return;
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(k);
}
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);
	pushup(k);
}
segment ask(int k,int l,int r){
	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:18
加载中...