求助
查看原帖
求助
1412685
zky114514楼主2024/8/1 19:15

样例未过

#include<bits/stdc++.h>
using namespace std;
#define ls t[x].ch[0]
#define rs t[x].ch[1]
using namespace std;
int N=100001,cnt;
struct node {
	int ch[2],cnt,size,val,rd;
} t[100001];
void up(int x) {
	t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}
void rotate(int &x,int d) {
	int tem= t[x].ch[d];
	t[x].ch[d]=t[tem].ch[d^1];
	t[tem].ch[d^1]=x;
	up(x);
	up(tem);
	x=tem;
}
void insert(int &x,int val) {
	if(!x) {
		x=++cnt;
		t[x].cnt=t[x].size=1;
		t[x].val=val,t[x].rd=rand();
		return;
	}
	t[x].size++;
	if(t[x].val == val) {
		t[x].cnt++;
		return;
	}
	int d=t[x].val < val;
	insert(t[x].ch[d],val);
	if(t[x].rd > t[t[x].ch[d]].rd) rotate(x,d);
}
void delet(int &x,int val) {
	if(!x) return;
	if(t[x].val == val) {
		if(t[x].cnt > 1) {
			t[x].cnt--;
			t[x].size--;
			return;
		}
		bool d=t[ls].rd > t[rs].rd;
		if(ls == 0 || rs == 0) x=ls+rs;
		else rotate(x,d),delet(x,val);
	} else t[x].size--,delet(t[x].ch[t[x].val<val],val);
}
int kth(int root,int k) {
	int x=root;
	while(1) {
		if(k <= t[ls].size) x=ls;
		else if(k > t[ls].size+t[x].cnt)
			k -= t[ls].size+t[x].cnt,x=rs;
		else return t[x].val;
	}
}
int rnk(int x,int val) {
	if(!x) return 1;
	if(t[x].val == val) return t[ls].size+1;
	if(t[x].val>val)return rnk(ls,val);
	return rnk(rs,val)+t[ls].size+t[x].cnt;
}
int ans;
int small(int root,int v){
	int k=root,ret=0;
	while(k){
		if(t[k].val<=v) ret=t[k].val,k=t[k].ch[1];
		else k=t[k].ch[0];
	}
	return ret;
}
int big(int root,int v){
	int k=root,ret=0; 
	while(k){
		if(t[k].val>=v) ret=t[k].val,k=t[k].ch[0];
		else k=t[k].ch[1];
	}
	return ret;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t,rt;
	cin>>t;
	int k;
	cin>>k;
	ans+=k;
	t--;
	while(t--){
		int x;
		cin>>x;
		int a=small(rt,x),b=big(rt,x);
		ans+=min(x-a,b-x);
		insert(rt,x);
	}
	cout<<ans;
}
2024/8/1 19:15
加载中...