RT,但是本地样例能过
球球了QwQ
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int n,sum[N*4],a,ans,cnt,zans;
void update(int o,int l,int r,int k,int v){
if(l==r){
sum[o]+=v;
return;
}
int mid=l+r>>1;
if(k<=mid)update(o*2,l,mid,k,v);
else update(o*2+1,mid+1,r,k,v);
sum[o]=sum[o*2]+sum[o*2+1];
}
int query(int o,int l,int r,int x,int y){
if(y<l||x>r)return 0;
if(x<=l&&r<=y)return sum[o];
int mid=l+r>>1;
return query(o*2,l,mid,x,y)+query(o*2+1,mid+1,r,x,y);
}
int query2(int o,int l,int r,int k){
if(l==r)return sum[o];
int mid=l+r>>1;
if(k<=mid)return query2(o*2,l,mid,k);
else return query2(o*2+1,mid+1,r,k);
}
int findkth(int o,int l,int r,int k){
if(l==r)return r;
int mid=l+r>>1;
if(k<=sum[o*2])findkth(o*2,l,mid,k);
else findkth(o*2+1,mid+1,r,k-sum[o*2]);
}
int getpre(int x,int n){
int k=query(1,1,N,1,x-1);
if(k==0)return -1;
return findkth(1,1,N,k);
}
int getnext(int x,int n){
int k=query(1,1,N,1,x)+1;
if(k==n)return -1;
return findkth(1,1,N,k);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(i==1) printf("%d\n",a),zans=a;
else{
ans=0;
if(query2(1,1,N,a)==0){
int x=getpre(a,i),y=getnext(a,i);
if(x==-1)ans=y-a;
else if(y==-1)ans=a-x;
else ans=min(a-x,y-a);
}
zans+=ans;
}
update(1,1,N,a,1);
}
cout<<zans;
}