第一次写splay tree, 只得了90分,找不到问题,先存着。
#include<bits/stdc++.h>
using namespace std;
int n,ans,key[32768],fat[32768],son[32768][2];
inline void rotate(int x){
int y=fat[x],z=x==son[y][0];
if(son[fat[y]][0]==y)son[fat[y]][0]=x;
else son[fat[y]][1]=x;
fat[x]=fat[y];
son[y][!z]=son[x][z];
fat[son[x][z]]=y;
son[x][z]=y;
fat[y]=x;
}
inline int add(int x,int y,int z){
if(key[y]==x)return 0;
if(key[y]>x){
if(son[y][0]==0){
key[z]=x;
fat[z]=y;
son[y][0]=z;
return 1;
}
return add(x,son[y][0],z);
}
else{
if(son[y][1]==0){
key[z]=x;
fat[z]=y;
son[y][1]=z;
return 1;
}
return add(x,son[y][1],z);
}
}
inline void splay(int x,int s){
if(fat[x]!=0){
int y=fat[x];
if(y==s)rotate(x);
else{
if((y==son[fat[y]][0])==(x==son[y][0])){
rotate(y);
rotate(x);
}
else{
rotate(x);
rotate(x);
}
splay(x,s);
}
}
}
inline int pre(int x){
if(son[x][1]==0)return key[x];
return pre(son[x][1]);
}
inline int nex(int x){
if(son[x][0]==0)return key[x];
return nex(son[x][0]);
}
int main(){
int m,i,x,y,z;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&m);
if(i==1){
key[1]=m;
ans+=m;
continue;
}
if(add(m,i-1,i)==0){
i--;
n--;
continue;
}
splay(i,i-1);
ans+=min(abs(m-pre(son[i][0])),abs(nex(son[i][1])-m));
}
printf("%d",ans);
return 0;
}
用set方法,是100分AC的。
#include<bits/stdc++.h>
using namespace std;
set<int>s1;
int n,i,t,ans;
set<int>::iterator a;
int main(){
scanf("%d",&n);
s1.insert(0x3f3f3f3f);
s1.insert(-0x3f3f3f3f);
for(i=1;i<=n;i++){
scanf("%d",&t);
if(i==1)
ans+=t;
else{
a=s1.lower_bound(t);
ans+=min(abs(t-*(--a)),abs(t-*a));
}
s1.insert(t);
}
printf("%d",ans);
return 0;
}