这个男人叫做卷毛,他被fhq-Treap按在墙上暴打,谁来救救他
查看原帖
这个男人叫做卷毛,他被fhq-Treap按在墙上暴打,谁来救救他
739250
Smi1EMAsk楼主2023/3/21 19:38
//OOOOOOOOOOOOOOOOrz
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int num=0,sign=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
	return num*sign;
}
const int N=32770,INF=0x3f3f3f3f;
struct Treap{
	int ls,rs,siz,val,key; 
}t[N];
int root,node;
void pushup(int id){
	t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;
}
void split(int now,int val,int &x,int &y){
	if(!now) return x=y=0,void();
	if(t[now].val<=val) x=now,split(t[now].rs,val,t[now].rs,y);
	else y=now,split(t[now].ls,val,x,t[now].ls);
	pushup(now);
}
int merge(int x,int y){
	if(!x||!y) return x^y;
	if(t[x].key>t[y].key){
		t[x].rs=merge(t[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		t[y].ls=merge(x,t[y].ls);
		pushup(y);
		return y;
	}
}
int x,y;
int new_node(int val){
	t[++node]={0,0,1,val,rand()};
	return node;
}
void insert(int val){
	split(root,val,x,y);
	root=merge(merge(x,new_node(val)),y);
}
int nlt(int val){
	split(root,val-1,x,y);
	int ans=t[x].siz+1;
	root=merge(x,y);
	return ans;
}
int kth(int id,int k){
	if(t[t[id].ls].siz+1==k) return t[id].val;
	if(t[t[id].ls].siz>=k) return kth(t[id].ls,k);
	return kth(t[id].rs,k-t[t[id].ls].siz-1);
}
void query(int val,int &a,int &b,int &c){
	a=kth(root,nlt(val-1));b=kth(root,nlt(val));c=kth(root,nlt(val+1));
}
int main(){
	srand((unsigned)time(NULL));
	int n=rd(),ans;
	insert(INF);insert(-INF);
	for(int i=1;i<=n;i++){
		int x=rd();
		if(i==1) ans=x;
		else{
			int a,b,c;
			query(x,a,b,c);
			ans+=min(min(abs(x-a),abs(x-b)),abs(x-c));
		}
		insert(x);
	}
	cout<<ans<<endl;
	return 0;
}

快来把可恶的WA绳之以法!!!

2023/3/21 19:38
加载中...