Splay Bzoj1588

贡献者:Vainglory 类别:代码 时间:2016-05-02 07:08:41 收藏数:9 评分:0
返回上页 举报此文章
请选择举报理由:




收藏到我的文章 改错字
#include <cstdio>
#include<cstring>
#include <algorithm>
#define maxn 33333
using namespace std;
const int inf=~0u>>2;
#define lc(x) ch[(x)][0]
#define min(x,y) (x)>(y)?(y):(x)
int fa[maxn],ch[maxn][2],root,k[maxn],ind=1;
inline void rotate(int p)
{
int q=fa[p],y=fa[q],x=ch[q][1]==p;
ch[q][x]=ch[p][x^1];fa[ch[q][x]]=q;
ch[p][x^1]=q;fa[q]=p;
fa[p]=y;
if(y)
{
if(ch[y][0]==q)ch[y][0]=p;
else if(ch[y][1]==q)ch[y][1]=p;
}
}
inline void splay(int x)
{
for(int y;y=fa[x];rotate(x))
if(fa[y])
rotate((x==lc(y))==(y==lc(fa[y]))?y:x);
root=x;
}
inline void insert(int x,int v)
{
int y;
while(true)
{
y=ch[x][k[x]<v];
if(y==0)
{
y=++ind;
k[y]=v;
ch[y][0]=ch[y][1]=0;
fa[y]=x;
ch[x][k[x]<v]=y;
break;
}
x=y;
}
splay(y);
}
inline int pre(int x)
{
int tmp=ch[x][0];
while(ch[tmp][1])tmp=ch[tmp][1];
return k[tmp];
}
inline int suc(int x)
{
int tmp=ch[x][1];
while(ch[tmp][0])tmp=ch[tmp][0];
return k[tmp];
}
int main()
{
int n,t,ans=0;
scanf("%d",&n);
if(scanf("%d",&t)==-1)t=0;
root=1;k[root]=t;
ch[root][0]=ch[root][1]=0;
fa[root]=0;
ans=t;
insert(root,inf);insert(root,-inf);
for(int i=2;i<=n;i++)
{
if(scanf("%d",&t)==-1)t=0;
insert(root,t);
int a=pre(root),b=suc(root);
ans+=min(t-a,b-t);
}
printf("%d\n",ans);
return 0;
}
声明:以上文章均为用户自行添加,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。
文章热度:
文章难度:
文章质量:
说明:系统根据文章的热度、难度、质量自动认证,已认证的文章将参与打字排名!

本文打字排名TOP20

登录后可见

用户更多文章推荐