MnZn刚学OI,fhq-Treap 样例未过求助
查看原帖
MnZn刚学OI,fhq-Treap 样例未过求助
148875
NaNO2_Cabbage楼主2023/9/14 16:09

RT,样例在最后一个输入时getpre和getnxt死循环,getval中rt以及v为0,蒟蒻以调不动,求助

#include <bits/stdc++.h>
#define upf(i, n, k) for (int i = k; i <= n; i++)
#define lowf(i, n, k) for (int i = n; i >= k; i--)
#define Max(a, b, c) max(a, max(b, c))
#define Min(a, b, c) min(a, min(b, c))
#define ofile(N) freopen(N ".in", "r", stdin), freopen(N ".out", "w", stdout)
#define ri register int
#define ie inline
#define ll long long
using namespace std;

ie int read() {
	int s = 0, w = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-')
			w = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
		s = s * 10 + ch - '0', ch = getchar();
	return s * w;
}

ie void out(int a) {
	if (a >= 10)
		out(a / 10);
	putchar(a % 10 + '0');
}

struct fhqTreap {
	int l, r, val, rnd, size;
} tr[100005];
int rt, idx;
int n, op, v;
int a[111111];

inline void add(int &x, int v) {
	x = ++idx, tr[x].val = v, tr[x].rnd = rand(), tr[x].size = 1;
}

inline void pushup(int p) {
	tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + 1;
}

inline void spilt(int p, int v, int &x, int &y) {
	if (!p) return x = y = 0, void();
	if (tr[p].val <= v) {
		x = p;
		spilt(tr[x].r, v, tr[x].r, y), pushup(x);
	} else {
		y = p;
		spilt(tr[y].l, v, x, tr[y].l), pushup(y);
	}
}

inline int merge(int x, int y) {
	if (!x || !y) return x + y;
	if (tr[x].rnd < tr[y].rnd) {
		tr[x].r = merge(tr[x].r, y);
		pushup(x);
		return x;
	} else {
		tr[y].l = merge(x, tr[y].l), pushup(y);
		return y;
	}
}

inline void del(int v) {
	int x, y, z;
	spilt(rt, v, x, z);
	spilt(x, v - 1, x, y);
	y = merge(tr[y].l, tr[y].r);
	rt = merge(merge(x, y), z);
}

inline void ins(int v) {
	int x, y, z;
	spilt(rt, v, x, y);
	add(z, v);
	rt = merge(merge(x, z), y);
}

inline int getrank(int v) {
	int x, y, z;
	spilt(rt, v - 1, x, y);
	int ans = tr[x].size + 1;
	rt = merge(x, y);
	return ans;
}

inline int getval(int root, int v) {
	if (v == tr[tr[root].l].size + 1)
		return tr[root].val;
	else if (v <= tr[tr[root].l].size)
		return getval(tr[root].l, v);
	else
		return getval(tr[root].r, v - tr[tr[root].l].size - 1);
}

inline int getnxt(int v) {
	int x, y, s, ans;
	spilt(rt, v, x, y);
	ans = getval(y, 1);
	rt = merge(x, y);
	return ans;
}

inline int getpre(int v) {
	int x, y, s, ans;
	spilt(rt, v - 1, x, y);
	s = tr[x].size;
	ans = getval(x, s);
	rt = merge(x, y);
	return ans;
}
int rettt;
int main() {
	// ofile("");ertertert
	n = read();
	a[1] = read();
	ins(a[1]);
	ins(21e8);
	ins(-21e8);
	rettt += a[1];
	for(int i = 2; i <= n; i++) {
		a[i] = read();
		int x = getpre(a[i]), y = getnxt(a[i]);
		if(x != -21e8 || y != 21e8)
			rettt += min(abs(x - a[i]), abs(y - a[i]));
		ins(a[i]);
	}
	cout << rettt << endl;
	return 0;

}
2023/9/14 16:09
加载中...