洛谷&LibreOJ AC, bzoj 全WA, 求助!!!
查看原帖
洛谷&LibreOJ AC, bzoj 全WA, 求助!!!
751073
wuxiyi楼主2023/7/17 11:44
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define int long long

/*
  underline  |   name
      1      |   new
*/

struct node{
	int l,r;
	int val;
	int ran;
}t[57257];
int tot,root,inf=114514114514;
int _(int val){
	t[++tot].val=val;
	t[tot].ran=rand();
	return tot;
}
void build(){
	tot=0;
	_(-inf),_(inf);
	root=1;
	t[1].r=2;
}
bool find(int p,int val){
	if (p==0)	return 0;
	if (t[p].val==val)	return 1;
	if (t[p].val<val)	return find(t[p].r,val);
	else	 return find(t[p].l,val);
}
void zig(int &p){
	int q=t[p].l;
	t[p].l=t[q].r;
	t[q].r=p;
	p=q;
}
void zag(int &p){
	int q=t[p].r;
	t[p].r=t[q].l;
	t[q].l=p;
	p=q;
}
void insert(int &p,int val){
	if (p==0){
		p=_(val);
		return ;
	}
	if (val==t[p].val)	return ;
	if (t[p].val<val){
		insert(t[p].r,val);
		if (t[p].ran<t[t[p].r].ran)	zag(p);
	}
	else{
		insert(t[p].l,val);
		if (t[p].ran<t[t[p].l].ran)	zig(p);
	}
}
int pre(int val){
	int ans=1;
	int p=root;
	while (p){
		if (val==t[p].val){
			if (t[p].l>0){
				p=t[p].l;
				while (t[p].r>0)	p=t[p].r;
				ans=p;
			}
			break;
		}
		if (t[p].val<val&&t[p].val>t[ans].val)	ans=p;
		if (t[p].val<val)	p=t[p].r;
		else	p=t[p].l;
	}
	return t[ans].val;
}
int next(int val){
	int ans=2;
	int p=root;
	while (p){
		if (val==t[p].val){
			if (t[p].r>0){
				p=t[p].r;
				while (t[p].l>0)	p=t[p].l;
				ans=p;
			}
			break;
		}
		if (t[p].val>val&&t[p].val<t[ans].val)	ans=p;
		if (t[p].val<val)	p=t[p].r;
		else	p=t[p].l;
	}
	return t[ans].val;
}
signed main(){
	build();
	int n,ans=0;
	scanf("%lld",&n);
	int x;
	scanf("%lld",&x);
	ans=x;
	insert(root,x);
	for (int i=2;i<=n;i++){
		scanf("%lld",&x);
		if (find(root,x));
		else{
			ans+=min(abs(x-pre(x)),next(x)-x);
		}
		insert(root,x);
	}
	printf("%lld\n",ans);
	return 0;
}
2023/7/17 11:44
加载中...