Treap没过样例求调QAQ
查看原帖
Treap没过样例求调QAQ
759274
Stevehim楼主2023/3/30 15:16
#include <bits/stdc++.h>
#define maxn 1000010
#define inf 2000000005
using namespace std;
typedef long long ll;
int sum = 0, rt = 0;
int size[maxn];
int v[maxn];
int num[maxn];
int rd[maxn];
int son[maxn][2];
stack<int> s;
int n, m;

template<typename T> inline void read(T &ff) {
	T rr = 1;
	ff = 0;
	register char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-')
			rr = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		ff = (ff << 1) + (ff << 3) + (ch ^ 48);
		ch = getchar();
	}
	ff *= rr;
}

void pushup(int p) {
	size[p] = size[son[p][0]] + size[son[p][1]] + num[p];
}

void rotate(int &p, int d) {
	int k = son[p][d ^ 1];
	son[p][d ^ 1] = son[k][d];
	son[k][d] = p;
	pushup(p);
	pushup(k);
	p = k;
}

void ins(int &p, int x) {
	if (!p) {
		p = ++sum;
		size[p] = num[p] = 1;
		v[p] = x;
		rd[p] = rand();
		return;
	}
	if (v[p] == x) {
		num[p] ++ ;
		size[p]++;
		return;
	}
	int d = (x > v[p]);
	ins(son[p][d], x);
	if (rd[p] < rd[son[p][d]])
		rotate(p, d ^ 1);
	pushup(p);
}

void del(int &p, int x) {
	if (!p)
		return;
	if (x < v[p])
		del(son[p][0], x);
	else if (x > v[p])
		del(son[p][1], x);
	else {
		if (!son[p][1] && !son[p][0]) { //没有孩子
			num[p]--;
			size[p]--;
			if (num[p] == 0)
				p = 0; //不存在了
		} else if (son[p][0] && !son[p][1]) {
			rotate(p, 1);
			del(son[p][1], x); //尝试提出优化
		} else if (son[p][1] && !son[p][0]) {
			rotate(p, 0);
			del(son[p][0], x); //尝试提出优化
		} else if (son[p][0] && son[p][1]) {
			int d = (rd[son[p][0]] > rd[son[p][1]]);
			rotate(p, d);
			del(son[p][d], x);
		}
	}
	pushup(p);
}

int pre(int p, int x) {
	if (!p)
		return -inf;
	if (v[p] >= x)
		return pre(son[p][0], x);
	else
		return max(v[p], pre(son[p][1], x));
}

int suc(int p, int x) {
	if (!p)
		return inf;
	if (v[p] <= x)
		return suc(son[p][1], x);
	else
		return min(v[p], suc(son[p][0], x));
}
char ch;
int opt;


bool vis[maxn] =  {false};
int main() {
	read(n), read(m);
//	ins(rt, 0);
	ins(rt, n + 1);
	for (register int i = 1; i <= m; i++) {
		cin >> ch;
		if (ch == 'D') {
			read(opt);
			s.push(opt);
			vis[opt] = true;
			ins(rt, opt);
		} else if (ch == 'R') {
			vis[s.top()] = false;
			del(rt, s.top());
			s.pop();
		} else {
			read(opt);
			if (vis[opt]) {
				cout << 0 << endl;
			} else {
				cout << suc(rt, opt) - pre(rt, opt) + 1 << endl;
			}
		}
	}
	return 0;
}
2023/3/30 15:16
加载中...