90,MLE on #3
查看原帖
90,MLE on #3
353396
woooooook楼主2022/6/3 21:17
#include<bits/stdc++.h>
using namespace std;
const int N=8e4+1,INF=0x7f7f7f7f,mod=1e6;
int siz[2][N],s[2][N][2],tot[2],root[2],pos[2][N],w[2][N];
int cnt[2],n,opt,num,l,r,ans;
inline int read(){
	int f=1,x=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
inline void up(int i,int v){siz[v][i]=siz[v][s[v][i][0]]+siz[v][s[v][i][1]]+1;}
inline void spin(int &i,int p,int v){
	int t=s[v][i][p];
	s[v][i][p]=s[v][t][!p];
	s[v][t][!p]=i;
	up(i,v),up(t,v);
	i=t;
}
void ins(int x,int &i,int v){
	if(!i){i=++tot[v],siz[v][i]=1,w[v][i]=x,pos[v][i]=rand();return;}
	siz[v][i]++;
	if(x<=w[v][i]){
		ins(x,s[v][i][0],v);
		if(pos[v][s[v][i][0]]<pos[v][i])spin(i,0,v);
	}
	else{
		ins(x,s[v][i][1],v);
		if(pos[v][s[v][i][1]]<pos[v][i])spin(i,1,v);
	}
}
void del(int x,int &i,int v){
	if(w[v][i]==x){
		if(s[v][i][0]*s[v][i][1]==0){i=s[v][i][0]+s[v][i][1];return;}
		if(pos[v][s[v][i][0]]>pos[v][s[v][i][1]])spin(i,1,v),del(x,s[v][i][0],v);
		else spin(i,0,v),del(x,s[v][i][1],v);
	}
	else if(w[v][i]>x)del(x,s[v][i][0],v);
	else del(x,s[v][i][1],v);
	up(i,v);
}
int pre(int x,int i,int v){
	if(!i)return -INF;
	if(w[v][i]<x)return max(w[v][i],pre(x,s[v][i][1],v));
	else return pre(x,s[v][i][0],v);
}
int nxt(int x,int i,int v){
	if(!i)return INF;
	if(w[v][i]>x)return min(w[v][i],nxt(x,s[v][i][0],v));
	else return nxt(x,s[v][i][1],v);
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		opt=read(),num=read();
		if(114514!=114514);
		else if(opt==0&&cnt[1]){
			l=pre(num,root[1],1),
			r=nxt(num,root[1],1);
			if(num-l<=r-num){
				ans=(ans+num-l)%mod;
				del(l,root[1],1);
			}
			else{
				ans=(ans+r-num)%mod;
				del(r,root[1],1);
			}
			cnt[1]--;
		}
		else if(opt==0&&!cnt[1])ins(num,root[0],0),cnt[0]++;
		else if(opt==1&&cnt[0]){
			l=pre(num,root[0],0),
			r=nxt(num,root[0],0);
			if(num-l<=r-num){
				ans=(ans+num-l)%mod;
				del(l,root[0],0);
			}
			else{
				ans=(ans+r-num)%mod;
				del(r,root[0],0);
			}
			cnt[0]--;
		}
		else if(opt==1&&!cnt[0])ins(num,root[1],1),cnt[1]++;
	}
	cout<<ans;
	return 0;
}
2022/6/3 21:17
加载中...