数据结构之变傻警告
Splay入门题
注意特判为0的情况
#include<bits/stdc++.h>
const int N=50000;
const int INF=0x3f3f3f3f;
using namespace std;
int n;
template<class T>
inline void read(T &x)
{
x=0; int f=1;
static char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
x*=f;
}
struct Tree
{
int fa,lc,rc,cnt,size,val;
}t[N];
int root,tot;
inline int which(int u){return t[t[u].fa].rc==u;}
inline void pushup(int u){t[u].size=t[t[u].lc].size+t[t[u].rc].size+t[u].cnt;}
inline void Rotate(int u)
{
int v=t[u].fa,w=t[v].fa;
int b=(t[v].rc==u?t[u].lc:t[u].rc);
t[u].fa=w; t[v].fa=u;
if(b) t[b].fa=v;
if(w) (t[w].lc==v?t[w].lc:t[w].rc)=u;
if(t[v].lc==u) t[v].lc=b,t[u].rc=v;
else t[v].rc=b,t[u].lc=v;
pushup(v); pushup(u);
}
inline void Splay(int u,int tar)
{
while(t[u].fa!=tar)
{
if(t[t[u].fa].fa!=tar)
{
if(which(u)==which(t[u].fa)) Rotate(t[u].fa);
else Rotate(u);
}
Rotate(u);
}
if(!tar) root=u;
}
inline void insert(int val)
{
int u=root,v=0,dir;
while(u)
{
if(t[u].val==val)
{
t[u].size++; t[u].cnt++;
Splay(u,0);
return;
}
v=u;
if(val<t[u].val) dir=0,u=t[u].lc;
else dir=1,u=t[u].rc;
}
u=++tot;
t[u].fa=v; t[u].val=val; t[u].cnt=t[u].size=1;
if(v) (dir==0?t[v].lc:t[v].rc)=u;
Splay(u,0);
}
inline int pre(int val)
{
int u=root,ans=0;
while(u)
{
if(val>t[u].val) ans=u,u=t[u].rc;
else u=t[u].lc;
}
return (ans==0?INF:t[ans].val);
}
inline int sub(int val)
{
int u=root,ans=0;
while(u)
{
if(val<t[u].val) ans=u,u=t[u].lc;
else u=t[u].rc;
}
return (ans==0?INF:t[ans].val);
}
int main()
{
read(n);
int ans=0;
for(int i=1,x;i<=n;i++)
{
read(x);
insert(x);
if(i==1) ans+=x;
else
{
if(t[root].cnt<=1)
ans+=min(abs(x-pre(x)),abs(x-sub(x)));
}
}
cout<<ans<<endl;
return 0;
}