求助10pts
查看原帖
求助10pts
782210
Yu_Chengxuan楼主2024/8/16 15:20
#include <bits/stdc++.h>
#define int long long
using namespace std;

inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&& ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
const int maxn = 5e5 + 10;
int a[maxn],tag[maxn*4],n,m; 
struct node{
	int l,r,ans;
}tree[maxn*4]; 
inline node merge(node a,node b){
	return (node){
		a.l==0 ? b.l : a.l,
		b.r==0 ? a.r : b.r,
		a.ans+b.ans-(a.r==b.l)};
}
inline void pushdown(int x){
	if (!tag[x]) return ;
	tree[x*2].l=tree[x*2].r=tag[x*2]=tree[x*2].l=tree[x*2+1].r=tag[x*2+1]=tag[x];
	tree[x*2].ans=tree[x*2+1].ans=1;
	tag[x]=0;
}
inline void pushup(int x){
	tree[x].l=tree[x*2].l;
	tree[x].r=tree[2*x+1].r;
	tree[x].ans=tree[x*2].ans+tree[x*2+1].ans-(tree[x*2].r==tree[x*2+1].l ? 1 : 0);
}
inline void reset(int x,int l,int r){
	tree[x].l=tree[x].r=a[l],tree[x].ans=1;
}
void build(int l=1,int r=n,int x=1){
	if(l==r){
		reset(x,l,r);
		return ;
	} 
	int mid=(l+r)>>1;
	build(l,mid,x*2);
	build(mid+1,r,x*2+1);
	pushup(x);
}
void update(int l,int r,int d,int cl=1,int cr=n,int x=1){
	if (l<=cl && cr<=r){
		tree[x].l=tree[x].r=tag[x]=d;
		tree[x].ans=1;
		return ;
	}
	int mid=(cl+cr)>>1;
	pushdown(x);
	if(l<=mid) update(l,r,d,cl,mid,x*2);
	if(r>=mid+1) update(l,r,d,mid+1,cr,x*2+1);
	pushup(x);
}
node query(int x,int l,int r,int cl=1,int cr=n){
	if(l<=cl && cr<=r){
		return tree[x];
	}
	int mid=(cl+cr)>>1;
	pushdown(x);
	node left={0,0,0},right={0,0,0};
	if(l<=mid){
		left = query(x*2,l,r,cl,mid);
	}
	if(r>=mid+1){
		right = query(x*2+1,l,r,mid+1,cr);
	}
	return merge(left,right);
}
int x,y;
int turn(int s){
	if(x){
		s=y-s+2;
	}
	else{
		s=s-y;
	}
	s = (s%n+n)%n;
	s = (!s) ? n : s;
	return s;
}
int q;
signed main() {
	n=read(),m=read();
	for (int i=1;i<=n;i++){
		a[i]=read();
	}
	build();
	q=read();
	while (q--){
		string s;
		cin >> s;
		if(s=="R"){
			int k=read();
			y=(y+k)%n;
		}
		else if(s=="F"){
			x^=1;
			y=(n-y+n)%n;
		}
		else if(s=="S"){
			int l=read(),r=read();
			int tl=turn(l);
			int tr=turn(r);
			int cl=query(1,tl,tl).l;
			int cr=query(1,tr,tr).l;
			if(cl!=cr){
				update(tl,tl,cr),update(tr,tr,cl);
			}
		}
		else if(s=="P"){
			int l=read(),r=read(),k=read();
			int nl=turn(l);
			int nr=turn(r);
			if(x){
				swap(nl,nr);
			}
			if(nl<=nr){
				update(nl,nr,k);
			}
			else {
				update(nl,n,k),update(1,nr,k);
			}
		}
		else if(s=="CS"){
			int l=read(),r=read();
			int tl=turn(l);
			int tr=turn(r);
			if(x) swap(tl,tr);
			int ans=0;
			if(tl<=tr){
				ans=query(1,tl,tr).ans;
			}
			else{
				ans=query(1,tl,n).ans+query(1,1,tr).ans;
				ans-=(tree[1].l==tree[1].r);
			}
			cout << ans << "\n";
		}
		else{
			cout << max(tree[1].ans-(tree[1].l==tree[1].r),1ll) << "\n";
		}		
	}
	return 0;
}
2024/8/16 15:20
加载中...