P3391求助,本地跑的飞快但是提上去6个T
查看原帖
P3391求助,本地跑的飞快但是提上去6个T
172642
Lidozs55楼主2021/4/29 19:28

rt

下了第一个测试数据,本地跑不到0.2s,提上去直接T,裂开,有谁能帮帮忙吗

6个T的评测 record/50087500

代码如下

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,tot,rt,siz[1000005],f[1000005],tag[1000005],num[1000005],s[1000005][2],ans[1000005];
inline void down(int k){
	if(tag[k]){
		tag[s[k][0]]^=1,tag[s[k][1]]^=1,tag[k]=0;
		swap(s[k][0],s[k][1]);
	}
}
inline void rotate(int k){
	int x=f[k],y=f[x],side=(k==s[x][1]);
	s[y][s[y][1]==x]=k,f[k]=y;
	s[x][side]=s[k][side^1];
	f[s[k][side^1]]=s[k][side^1]=x,f[x]=k;
	siz[x]=siz[s[x][1]]+siz[s[x][0]]+1;
	siz[k]=siz[s[k][1]]+siz[s[k][0]]+1;
}
inline void splay(int k,int pos){
	int x,y;
	while(f[k]!=pos){
		x=f[k],y=f[x];
		if(y!=pos)(k==s[x][0])^(x==s[y][0])?rotate(k):rotate(x);
		rotate(k);
	}
	if(!pos)rt=k;
}
inline int find(int k){
	int u=rt;
	while(1){
		down(u);
		if(siz[s[u][0]]>=k)u=s[u][0];
		else if(siz[s[u][0]]+2>k)return u;
		else k-=siz[s[u][0]]+1,u=s[u][1];
	}
}
int build(int l,int r,int k){
	if(l>r)return 0;
	int pos=(l+r)>>1;
	f[pos]=k,num[pos]=ans[pos],s[pos][0]=build(l,pos-1,pos),s[pos][1]=build(pos+1,r,pos);
	siz[pos]=siz[s[pos][0]]+siz[s[pos][1]]+1;
	return pos;
}
void update(int k){
	if(!k)return;
	down(k),update(s[k][0]),ans[++tot]=num[k],update(s[k][1]);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n+2;i++)ans[i+1]=i;
	rt=build(1,n+2,0);
	for(int i=0,x,y;i<m;++i)scanf("%d%d",&x,&y),x=find(x),y=find(y+2),splay(x,0),splay(y,x),tag[s[s[rt][1]][0]]^=1;
	update(rt);
	for(int i=1;i<=n;i++)printf("%d ",ans[i+1]);
	return 0;
}
2021/4/29 19:28
加载中...