Treap求调!
查看原帖
Treap求调!
922943
rc_Taurus楼主2024/8/1 09:55

rt,样例不过,提交0pts

#include<bits/stdc++.h>
using namespace std;
const int N=50005;
const int INF=1e7+10;
int n,tot,rt,x,kkk;
struct treap{
	int c[2];
	int val,ran,cnt;
}t[N];
int add(int v){
	t[++tot].val=v;
	t[tot].ran=rand();
	t[tot].cnt=1;
	return tot;
}
void build(int v){
	rt=add(v);
}
void chen_zhe(int &k,int v){
	int six_kills=t[k].c[!v];
	t[k].c[!v]=t[k].c[v];
	t[k].c[v]=k;
	k=six_kills;
}
void insert(int &k,int v){
	if(!k){
		k=add(v);
		return;
	}
	if(v==t[k].val)t[k].cnt++;
	else{
		int d=v<t[k].val?0:1;
		insert(t[k].c[d],v);
		if(t[k].ran>t[t[k].c[d]].ran)chen_zhe(k,!d);
	}
}
int query_less(int x){
	int k=rt;
	int res=-INF;
	while(k){
		if(t[k].val<=x)res=t[k].val,k=t[k].c[1];
		else k=t[k].c[0];
	}
	return res;
}
int query_greater(int x){
	int k=rt;
	int res=INF;
	while(k){
		if(t[k].val>=x)res=t[k].val,k=t[k].c[0];
		else k=t[k].c[1];
	}
	return res;
}
int main(){
	cin>>n>>x;
	build(x);
	for(int i=2;i<=n;i++){
		cin>>x;
		int minn=query_less(x);
		int maxn=query_greater(x);
		int ans=min(x-minn,maxn-x);
		kkk+=ans;
		insert(rt,x);
	}
	cout<<kkk<<endl;
	return 0;
}
2024/8/1 09:55
加载中...