https://www.luogu.org/problemnew/show/2286
splay 裸题
#include<cstdio> const int mod=1e6; const int maxn=1e5; int n,who,com,now,ans; int t[maxn],f[maxn],s[maxn][2]; int in,ax,rt,sz; inline int min_(int x,int y){return x<y?x:y;} void rot(int x){ int y=f[x],z=f[y],l,r; l=s[y][0]==x?0:1; r=l^1; if(y==rt) rt=x; else{ if(s[z][0]==y) s[z][0]=x; else s[z][1]=x; } f[x]=z,f[y]=x,f[s[x][r]]=y; s[y][l]=s[x][r],s[x][r]=y; } void splay(int x){ int y,z; while(x!=rt){ y=f[x],z=f[y]; if(y!=rt){ if(s[y][0]==x^s[z][0]==y) rot(x); else rot(y); } rot(x); } } void ins(int&k,int x,int fa){ if(!k){ ++sz,k=sz; t[k]=x,f[k]=fa; splay(k); return; } if(x<t[k]) ins(s[k][0],x,k); else ins(s[k][1],x,k); } void fin(int k,int x){ if(!k) return; if(x>t[k]) in=k,fin(s[k][1],x); else fin(s[k][0],x); } void fax(int k,int x){ if(!k) return; if(x<t[k]) ax=k,fax(s[k][0],x); else fax(s[k][1],x); } void del(int x){ splay(x); if(s[x][0]&&s[x][1]){ int k=s[x][1];rt=k; while(s[k][0]) k=s[k][0]; s[k][0]=s[x][0],f[s[x][0]]=k; } else rt=s[x][0]+s[x][1]; f[rt]=0; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&who,&com); if((who&&now<0)||(!who&&now>0)){ in=maxn-1,ax=maxn-2,t[in]=-1e9,t[ax]=1e9; fin(rt,com),fax(rt,com); ans=(ans+min_(t[ax]-com,com-t[in]))%mod; if(com-t[in]<=t[ax]-com) del(in); else del(ax); } else ins(rt,com,0); now+=who?1:-1; } printf("%d ",ans); return 0; }