如题,样例已过,0分代码,卡了我一晚上。 大佬能帮忙找找错吗?
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAXN=1000005;
void read(int &data){
int flag=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
data=x*flag;
}
int ch[MAXN][2],sz[MAXN],cnt[MAXN],val[MAXN];
int fa[MAXN],tot,rt,ans=0,INF;
void maintain(int k){sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+cnt[k]; }
void clear(int k){cnt[k]=sz[k]=val[k]=fa[k]=ch[k][0]=ch[k][1]=0;}
bool get(int k){return k==ch[fa[k]][1];};
void rotate(int x) {
int y=fa[x],z=fa[y],chk=get(x);
ch[y][chk]=ch[x][chk^1];
if (ch[x][chk^1]) fa[ch[x][chk^1]]=y;
ch[x][chk^1]=y;
fa[y]=x;
fa[x]=z;
if(z) ch[z][y==ch[z][1]]=x;
maintain(x);
maintain(y);
}
void splay(int x){
for(int f;f=fa[x];rotate(x)){
if(fa[f]) rotate(get(x)==get(f)?f:x);
}
rt=x;
}
int pre(){
int cur=ch[rt][0];
if(cur==0) return INF;
while(ch[cur][1]) cur=ch[cur][1];
//splay(cur);
return val[cur];
}
int nxt(){
int cur=ch[rt][1];
if(cur==0) return INF;
while(ch[cur][0]) cur=ch[cur][0];
//splay(cur);
return val[cur];
}
void Insert(int k){
if(!rt){
rt=++tot;
sz[tot]=cnt[tot]=1;
val[tot]=k;
maintain(rt);
return;
}
int cur=rt,f=0;
while(1){
if(k==val[cur]){
++cnt[cur];
maintain(cur);
maintain(f);
splay(cur);
return;
}
f=cur,cur=ch[cur][k>val[cur]];
if(!cur){
++tot;
cnt[tot]=sz[tot]=1;
val[tot]=k;
fa[tot]=f;
ch[f][k>val[f]]=tot;
maintain(f);
splay(tot);
return;
}
}
}
int main(){
int n,x,ans;
// read(n);
scanf("%d",&n);
memset(&INF,0x7f,sizeof(INF));
for(int i=1;i<=n;i++){
//read(x);
scanf("%d",&x);
Insert(x);
if(i==1) ans+=x;
else{
if(cnt[rt]<=1)
ans+=min(abs(x-pre()),abs(x-nxt()));
}
}
// for(int i=1;i<=n;i++) cout<<fa[i]<<" ";
printf("%d",ans);
return 0;
}