90分求助
查看原帖
90分求助
126796
zws_hao楼主2021/10/28 21:28
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e7+10;
const int N=1e5*5+10;
int n,Ans,rt,k,x,y;
inline int read(){
	int ss=0,tt=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='=') tt*=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ss=ss*10+(c-'0');
		c=getchar();
	}
	return ss*tt;
}
struct node{
	int l,r,p,v;
	#define lc(x) t[x].l
	#define rc(x) t[x].r
	#define p(x) t[x].p
	#define vis(x) t[x].v
}t[N];
int T;
inline void Zig(int &x){
	int y=lc(x);
	lc(x)=rc(y),rc(y)=x;
	x=y;
}
inline void Zag(int &x){
	int y=rc(x);
	rc(x)=lc(y),lc(y)=x;
	x=y;
}
inline void Insert(int &x,const int vi){
	if(!x){
		vis(x=++T)=vi,p(x)=rand();
		return;
	}
	if(vi<vis(x)){
		Insert(lc(x),vi);
		if(p(lc(x))<p(x)) Zig(x);
	}else{
		Insert(rc(x),vi);
		if(p(rc(x))<p(x)) Zag(x);	
	}
}
inline int QueryPre(const int vi){
	int x=rt,pr=-Maxn;
	while(x){
		if(vi>=vis(x)) pr=vis(x),x=rc(x);
		else x=lc(x);
	}
	return pr;
}
inline int QuerySuf(const int vi){
	int x=rt,sf=Maxn;
	while(x){
		if(vi<=vis(x)) sf=vis(x),x=lc(x);
		else x=rc(x);
	}
	return sf;
}
int main(){
	n=read();
	Ans=read();Insert(rt,Ans);	
	for(int i=2;i<=n;i++){
		k=read();
		x=QueryPre(k),y=QuerySuf(k);
		//cout<<x<<" "<<y<<endl;
		Ans+=min(k-x,y-k);
		//cout<<Ans<<endl;
		Insert(rt,k);
	}
	cout<<Ans<<endl;
	return 0;
}
2021/10/28 21:28
加载中...