FHQ-Treap TLE(死循环)求条,悬一关
查看原帖
FHQ-Treap TLE(死循环)求条,悬一关
1060759
qw1234321楼主2024/2/29 20:01

rt.

#include<bits/stdc++.h>
#define int long long
#define il inline
using namespace std;

const int N = 100005;
int n, m, x, ret, det, tl, tr, ans;

struct Treap{
	int tot, root, INF = 0x3f3f3f3f;
	struct node{
		int l, r, sn;
		int fa, v, det, cnt;
	}t[N];
	il int create(int x){
		t[++tot].v = x;
		t[tot].sn = 1;
		t[tot].det = rand();
		return tot;
	}
	il void up(int x){
		t[x].sn = t[t[x].l].sn + t[t[x].r].sn + 1;
	}
	il void split(int p, int v, int &l, int &r){
		if (!p){
			l = r = 0;
			return ;
		}
		if (t[p].v <= v){
			l = p;
			split(t[l].r, v, t[l].r, r);
		}
		else{
			r = p;
			split(t[r].l, v, l, t[r].l);
		}
		up(p);
	}
	il int merge(int l, int r){
		if (!l || !r) return l | r;
		if (t[l].det < t[r].det){
			t[l].r = merge(t[l].r, r);
			up(l);
			return l;
		}
		else{
			t[r].l = merge(l, t[r].l);
			up(r);
			return r;
		}
	}
	il void ins(int v){
		split(root, v - 1, tl, tr);
		root = merge(merge(tl, create(v)), tr);
	}
	il void del(int v){
		int tmp;
		split(root, v - 1, tl, tr);
		split(tr, v, tmp, tr);
		tmp = merge(t[tmp].l, t[tmp].r);
		root = merge(tl, merge(tmp, tr));
	}
	il int find_kth(int v){
		split(root, v - 1, tl, tr);
		int rk = t[tl].sn + 1;
		root = merge(tl, tr);
		return rk;
	}
	il int kth_find(int p, int k){
		int ln = t[t[p].l].sn + 1;
		if (ln == k) return t[p].v;
		else if (ln < k) return kth_find(t[p].r, k - ln);
		else return kth_find(t[p].l, k);
	}
	il int pre(int v){
		split(root, v - 1, tl, tr);
		int tmp = kth_find(tl, t[tl].sn);
		root = merge(tl, tr);
		return tmp;
	}
	il int nxt(int v){
		split(root, v, tl, tr);
		int tmp = kth_find(tr, 1);
		root = merge(tl, tr);
		return tmp;
	}
}fhq;

signed main(){
	srand(time(NULL));
	cin >> n >> x;
	ans += x;
	fhq.ins(x);
	for (int i = 2; i <= n; i++){
		cin >> x;
		int pe = x - fhq.pre(x), nt = fhq.nxt(x) - x;
		ans += min(pe, nt);
		fhq.ins(x);
	}
	cout << ans;
	return 0;
}
2024/2/29 20:01
加载中...