bzoj1588
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
int pre[MAXN],ch[MAXN][2],key[MAXN];
int root,tot1;
void NewNode(int &r,int father,int k)
{
r=++tot1;
pre[r]=father;
ch[r][0]=ch[r][1]=0;
key[r]=k;
}
void Init()
{
root=tot1=0;
ch[root][0]=ch[root][1]=key[root]=pre[root]=0;
}
//旋转
void Rotate(int x,int kind)
{
int y=pre[x];
ch[y][!kind]=ch[x][kind];
pre[ch[x][kind]]=y;
if(pre[y])
ch[pre[y]][ch[pre[y]][1]==y]=x;
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
}
//Splay调整
void Splay(int r,int goal)
{
while(pre[r]!=goal)
{
if(pre[pre[r]]==goal)
Rotate(r,ch[pre[r]][0]==r);
else
{
int y=pre[r];
int kind=ch[pre[y]][0]==y;
if(ch[y][kind]==r)
{
Rotate(r,!kind);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
if(goal==0)root=r;
}
void Insert(int k)//插入一个值为k的结点
{
int r=root;
if(r==0)
{
NewNode(root,0,k);
return;
}
while(ch[r][key[r]<k])
{
r=ch[r][key[r]<k];
}
NewNode(ch[r][key[r]<k],r,k);
Splay(ch[r][key[r]<k],0);
}
int Get_Min(int r)
{
while(ch[r][0])
{
r=ch[r][0];
}
return r;
}
int Get_Max(int r)
{
while(ch[r][1])
{
r=ch[r][1];
}
return r;
}
int main()
{
int n,num,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if(scanf("%d",&num)==EOF)num=0;
Insert(num);
if(i==1) ans+=num;
else
{
int tmp=INF;
if(ch[root][0])
tmp=min(tmp,key[root]-key[Get_Max(ch[root][0])]);
if(ch[root][1])
tmp=min(tmp,key[Get_Min(ch[root][1])]-key[root]);
ans+=tmp;
}
}
printf("%d\n",ans);
return 0;
}
Splay——kuangnin的模版
最新推荐文章于 2024-06-23 00:49:38 发布