splay TLE on test2求助
查看原帖
splay TLE on test2求助
238861
xzzduang楼主2021/8/27 16:37
#include<iostream>
#include<stdio.h>
#define N 200005
#define mo 998244353
#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<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}
int power(int x,int b){
	int res=1;
	while(b){
		if(b&1) res=res*x%mo;
		x=x*x%mo;
		b>>=1;
	}
	return res;
}
int fac[N*2],ifac[N*2];
int cas,n,m,sze[N],son[N][2],ff[N],pool,rt,val[N],cnt;
void update(int k){
	sze[k]=sze[son[k][0]]+sze[son[k][1]]+1;
}
void rotate(int x){
	int fa=ff[x],gf=ff[fa],k=(son[fa][1]==x);
	son[gf][(son[gf][1]==fa)]=x;
	ff[x]=gf;
	son[fa][k]=son[x][k^1];
	ff[son[x][k^1]]=fa;
	son[x][k^1]=fa;
	ff[fa]=x;
	update(fa),update(x);
}
void splay(int x,int goal){
	while(ff[x]!=goal){
		int fa=ff[x],gf=ff[fa];
		if(gf!=goal)
			((son[gf][1]==fa)^(son[fa][1]==x))?rotate(x):rotate(fa);
		rotate(x);
	}
	if(!goal) rt=x;
}
int find(int x){
	int now=rt;
	while(x){
		if(x<=sze[son[now][0]]) now=son[now][0];
		else{
			if(x>sze[son[now][0]]+1)
				x-=(sze[son[now][0]]+1),now=son[now][1];
			else break;
		}
	}
	return now;
}
void init(int lim){
	fac[0]=ifac[0]=1;
	for(int i=1;i<=lim;++i) fac[i]=fac[i-1]*i%mo;
	ifac[lim]=power(fac[lim],mo-2);
	for(int i=lim;i>=2;--i) ifac[i-1]=ifac[i]*i%mo;
}
int C(int x,int y){
	if(y>x) return 0;
	return fac[x]*ifac[x-y]%mo*ifac[y]%mo;
}
signed main(){
	init(N*2-1);
	cas=read();
	while(cas--){
		n=read(),m=read();
		rt=1;
		pool=3;
		son[1][1]=2;
		ff[2]=1;
		son[2][1]=3;
		ff[3]=2;
		sze[1]=3;
		sze[2]=2;
		sze[3]=1;
		val[1]=val[3]=0;
		val[2]=1;
		for(int i=1;i<=m;++i){
			read();
			int x=read()+1;
			int pre=find(x-1);
			splay(pre,0);
			int tmp=find(x);
			splay(tmp,pre);
			son[tmp][0]=++pool;
			ff[pool]=tmp;
			val[pool]=1;
			val[tmp]=0;
			sze[pool]=1,update(tmp),update(pre);
		}
		cnt=0;
		for(int i=1;i<=pool;++i){
			cnt+=val[i];
		}
		cnt+=n-m-2;
		printf("%lld\n",C(n+cnt,n));
		for(int i=1;i<=pool;++i){
			val[i]=son[i][0]=son[i][1]=sze[i]=ff[i]=0;
		}
		pool=rt=0;
	}
	return 0;
}

时间复杂度很对了,可是连3w的点都跑不过

2021/8/27 16:37
加载中...