萌新刚学WBLT,各位路过的大佬能不能帮忙调一下
查看原帖
萌新刚学WBLT,各位路过的大佬能不能帮忙调一下
716965
L_zaa_L楼主2025/1/8 19:23
#include<bits/stdc++.h>
#define int long long
#define ls(x) (ch[x][0])
#define rs(x) (ch[x][1])
#define Debug(...) fprintf(stderr, __VA_ARGS__)
#define For(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define Rof(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define rep(i,  b) for(int i=1,i##end=b;i<=i##end;i++)
using namespace std;
const int N=3e5+5,base=999983,Mod=998244353;
const double alpha=0.29;
//char buf[(1<<21)+5],*p1,*p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline void chmx(int &x,int y){(x<y)&&(x=y);}
inline void chmn(int &x,int y){(x>y)&&(x=y);}
inline void Add(int &x,int y){(x=x+y+Mod)%=Mod;}
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f?-x:x;
}
void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n%10+'0');
}
int n,m;
int a[N],mi[N];int rt;
struct WBLT{
	int tr[N],cnt,ch[N][2];
	int lj[N],pops,siz[N];	
	int lzrev[N],rev[N],cov[N];
	int px[N],pn[N],sx[N],sn[N];
	inline int getnode(int k){
		int p=(pops>0?lj[pops--]:++cnt);
		siz[p]=1;ch[p][0]=ch[p][1]=0;
		tr[p]=k;px[p]=sx[p]=pn[p]=sn[p]=0;
		lzrev[p]=rev[p]=cov[p]=0;
		if(k==1) px[p]=sx[p]=1;
		else pn[p]=sn[p]=-1;
		return p;
	}
	inline void pushup(int x){
		siz[x]=siz[ls(x)]+siz[rs(x)];
		tr[x]=(tr[ls(x)]+tr[rs(x)]);
		px[x]=max(px[ls(x)],tr[ls(x)]+px[rs(x)]);
		pn[x]=min(pn[ls(x)],tr[ls(x)]+pn[rs(x)]);
		sx[x]=max(sx[rs(x)],tr[rs(x)]+sx[ls(x)]);
		sn[x]=min(sn[rs(x)],tr[rs(x)]+sn[ls(x)]);
	}inline void rotate(int x,int d){
		swap(ls(x),rs(x));
		swap(ls(ch[x][d^1]),rs(ch[x][d^1]));
		swap(ch[ch[x][d^1]][d^1],ch[x][d]);
		pushup(ch[x][d^1]);pushup(x);
	}inline void downcov(int x,int k){
		if(!x)return;
		tr[x]=siz[x]*k;
		if(k==1) px[x]=sx[x]=tr[x],pn[x]=sn[x]=0;
		else pn[x]=sn[x]=tr[x],px[x]=sx[x]=0;
		cov[x]=k;
	}inline void downrev(int x){
		if(!x)return;
		swap(ls(x),rs(x));
		swap(px[x],sx[x]);
		swap(pn[x],sn[x]);
		rev[x]^=1;
	}inline void downr(int x){
		if(!x)return;tr[x]=-tr[x];
		swap(px[x],pn[x]);px[x]=-px[x],pn[x]=-pn[x];
		swap(sx[x],sn[x]);sx[x]=-sx[x],sn[x]=-sn[x];
		lzrev[x]^=1;cov[x]=-cov[x];
	}
	inline void pushdown(int x){
		if(lzrev[x]){
			downr(ls(x));
			downr(rs(x));
			lzrev[x]=0;
		}if(cov[x]){
			downcov(ls(x),cov[x]);
			downcov(rs(x),cov[x]);
			cov[x]=0;
		}
		if(rev[x]){
			downrev(ls(x));
			downrev(rs(x));
			rev[x]=0;
		}
	}
	inline void maintain(int x){
		pushdown(x);
		if(siz[x]==1) return;
		if(min(siz[ls(x)],siz[rs(x)])>=alpha*siz[x]) return;
		int d=(siz[ls(x)]<alpha*siz[x]);
		pushdown(ch[x][d]);
		if(siz[ch[ch[x][d]][d^1]]*(1-alpha)>=siz[ch[x][d]]*(1-2*alpha))rotate(ch[x][d],d^1);
		rotate(x,d);
	}void ins(int x,int k,int p){
		if(siz[x]==1){
			ls(x)=getnode(tr[x]),rs(x)=getnode(p);
			pushup(x);
			return;
		}if(siz[ls(x)]>=k) ins(ls(x),k,p);
		else ins(rs(x),k-siz[ls(x)],p);
		pushup(x);maintain(x);
	}void del(int &x,int k){
		if(tr[ls(x)]>=k){
			if(siz[ls(x)]==1){
				lj[++pops]=x;
				lj[++pops]=ls(x);x=rs(x);
			}else del(ls(x),k),pushup(x),maintain(x);
		}else{
			if(siz[rs(x)]==1){
				lj[++pops]=x;
				lj[++pops]=rs(x);x=ls(x);
			}else del(rs(x),k),pushup(x),maintain(x);
		}
	}int merge(int x,int y){
		if(!x||!y) return x|y;
		int k=siz[x]+siz[y];
		if(min(siz[x],siz[y])>=alpha*k){
			int p=getnode(0);
			ls(p)=x,rs(p)=y;pushup(p);
			return p;
		}if(siz[x]>=siz[y]){
			pushdown(x); 
			if(siz[ls(x)]>=alpha*k){
				rs(x)=merge(rs(x),y);
				pushup(x);
				return x;
			}ls(x)=merge(ls(x),ls(rs(x)));
			pushdown(rs(x));
			int p=rs(x);
			rs(x)=merge(rs(rs(x)),y);
			lj[++pops]=p;pushup(x);
			return x;
		}else{
			pushdown(y);
			if(siz[rs(y)]>=alpha*k){
				ls(y)=merge(x,ls(y));
				pushup(y);
				return y;
			}rs(y)=merge(rs(ls(y)),rs(y));
			int p=ls(y);pushdown(ls(y));
			ls(y)=merge(x,ls(ls(y)));
			lj[++pops]=p;pushup(y); 
			return y;
		}
	}void split(int x,int k,int &l,int &r){
		if(!k) return (void)(l=0,r=x);
		pushdown(x);
		if(siz[x]==1){
			l=x,r=0;
			return;
		}if(k>=siz[ls(x)]){
			split(rs(x),k-siz[ls(x)],l,r);
			l=merge(ls(x),l);lj[++pops]=x;
		}else{
			split(ls(x),k,l,r);
			r=merge(r,rs(x));lj[++pops]=x;
		}
	}
	inline int num(int k){
		int x=rt;
		while(1){
			if(siz[x]==1) return k==1?tr[x]:-1;
			else if(siz[ls(x)]>=k) x=ls(x);
			else k-=siz[ls(x)],x=rs(x);
		}
	}
	
}t;char s[N];
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	// ios::sync_with_stdio(false);
	// cin.tie(0); cout.tie(0);
	int n=read();
	int Q=read();
	scanf("%s",s+1);rt=t.getnode(0);
	For(i,1,n) t.ins(rt,i,(s[i]=='('?-1:1));
	while(Q--){
		string s;cin>>s;
		if(s=="Replace"){
			int l=read(),r=read();char x;cin>>x;
			int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
			t.downcov(t3,(x=='('?-1:1)); 
			rt=t.merge(t1,t.merge(t3,t4));
		}else if(s=="Swap"){
			int l=read(),r=read();
			int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
			t.downrev(t3);
			rt=t.merge(t1,t.merge(t3,t4));
		}else if(s=="Invert"){
			int l=read(),r=read();
			int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
			t.downr(t3);
			rt=t.merge(t1,t.merge(t3,t4));
		}else{
			int l=read(),r=read();
			int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
			printf("%lld\n",(abs(t.pn[t3])+1)/2+(abs(t.sx[t3])+1)/2);
			rt=t.merge(t1,t.merge(t3,t4));
		}
	}
#ifdef LOCAL
    Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
	return 0;
}
2025/1/8 19:23
加载中...