#include<bits/stdc++.h>
using namespace std;
const int N=35000;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n;
int ans;
int tot,rt;
struct TREE{
int val,siz,sum;
int fa,son[2];
}t[N];
inline void upd(int p){
t[p].siz=t[p].sum+t[t[p].son[0]].siz+t[t[p].son[1]].siz;
}
inline bool right(int p){
return t[t[p].fa].son[1]==p;
}
void rotate(int p){
int f1=t[p].fa;
int f2=t[f1].fa;
bool id=right(p);
t[f1].son[id]=t[p].son[!id];
t[t[f1].son[id]].fa=f1;
t[p].fa=f2;
t[f2].son[right(f1)]=p;
t[p].son[!id]=f1;
t[f1].fa=p;
upd(f1);
}
void Splay(int p,int to=0){
while(t[p].fa!=to){
int f1=t[p].fa,f2=t[f1].fa;
if(f2!=to){
if(right(p)==right(f1)) rotate(f1);
else rotate(p);
}
rotate(p);
}
upd(p);
if(!to) rt=p;
}
void find(int x){
int p=rt;
while(t[p].son[x>t[p].val]&&x!=t[p].val) p=t[p].son[x>t[p].val];
Splay(p);
}
bool insert(int x){
int p=0,now=rt;
while(now&&x!=t[now].val){
p=now;
now=t[now].son[x>t[now].val];
}
if(now){
t[now].sum++;
return 0;
}else{
now=++tot;
t[now].fa=p;
t[now].val=x;
t[now].sum=t[now].siz=1;
t[p].son[x>t[p].val]=now;
}
Splay(now);
return 1;
}
int pre(int x){
if(t[rt].val<x) return rt;
int p=t[rt].son[0];
while(t[p].son[1]) p=t[p].son[1];
return p;
}
int nxt(int x){
if(t[rt].val>x) return rt;
int p=t[rt].son[1];
while(t[p].son[0]) p=t[p].son[0];
return p;
}
void del(int x){
if(!insert(x)) return;
find(x);
int pr=pre(x);
int nt=nxt(x);
// printf("//%d\n",min(abs(t[pr].val-x),abs(t[nt].val-x)));
ans+=min(abs(t[pr].val-x),abs(t[nt].val-x));
}
int main(void){
n=read();
int x;
insert(0x3f3f3f3f);
insert(-0x3f3f3f3f);
ans=read();
insert(ans);
for(int i=2;i<=n;i++){
x=read();
del(x);
}
printf("%d\n",ans);
return 0;
}
萌新刚学数据结构。
第一个点为什么会被TLE?疑似屎循环?
求助各位大佬。。。
感激不尽。。