题目链接:BZOJ 1208
这道splay写的我还有什么话可说呢?一开始一直TLE,然后各种debug,最后才发现自己if语句写挂了= =。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
#define maxn (80000+10)
int N,col=-1,root=0,idx=0,mod=1e6,t1,t2;
long long ans=0;
int v[maxn],c[maxn][2],fa[maxn];
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(c[y][0]==x)l=0; else l=1; r=l^1;
if(y==k)k=x;
else{
if(c[z][0]==y)c[z][0]=x; else c[z][1]=x;
}
fa[c[x][r]]=y; fa[y]=x; fa[x]=z;
c[y][l]=c[x][r]; c[x][r]=y;
}
void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if((c[y][0]==x)==(c[z][0]==y))rotate(y,k);
else rotate(x,k);
}
rotate(x,k);
}
}
void ins(int &k,int x,int f){
if(k==0){idx++; k=idx; v[k]=x; fa[k]=f; splay(k,root); return ;}
else{
if(v[k]>x)ins(c[k][0],x,k); else ins(c[k][1],x,k);
}
}
void del(int x){
splay(x,root);
if(c[x][0]*c[x][1]==0)root=c[x][0]+c[x][1];
else{
int k=c[x][1];
while(c[k][0])k=c[k][0];
c[k][0]=c[x][0]; fa[c[x][0]]=k;
root=c[x][1];
}
fa[root]=0;
}
void pre(int k,int x){//前驱
if(k==0)return ;
if(v[k]<=x){t1=k; pre(c[k][1],x);}
else pre(c[k][0],x);
}
void ne(int k,int x){//后继
if(k==0)return ;
if(v[k]>=x){t2=k; ne(c[k][0],x);}
else ne(c[k][1],x);
}
void get(int x){
t1=t2=-1;
pre(root,x); ne(root,x);
if(t1==-1){ans+=v[t2]-x; ans%=mod; del(t2);}
else if(t2==-1){ans+=x-v[t1]; ans%=mod; del(t1);}
else{
if(x-v[t1]>v[t2]-x){ans+=v[t2]-x; ans%=mod; del(t2);}
else {ans+=x-v[t1]; ans%=mod; del(t1);}
}
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++){
int a,b;scanf("%d%d",&a,&b);
if(!root){
col=a; ins(root,b,0); continue;
}
else if(col==a)ins(root,b,0);
else {
get(b);
}
}
cout<<ans<<endl;
return 0;
}