社区讨论

本地 + 洛谷IDE AC, 交上去全t, 求调.

P3391【模板】文艺平衡树参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8wb5fi
此快照首次捕获于
2023/10/28 01:36
2 年前
此快照最后确认于
2023/10/28 01:36
2 年前
查看原帖
RT
CPP
#include <cstdio>
#include <cctype> 
#include <algorithm>

using namespace std; 

inline int read() {
	int x = 0, f = 0; char ch = getchar(); 
	while (!isdigit(ch)) f = ch == '-', ch = getchar(); 
	while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar(); 
	return f ? -x : x; 
}

const int N = 1e5 + 10; 
int n, m, rt; 
struct Node {
	int fa, son[2], siz, rev, data; 
};
Node nd[N]; 

int get(int x) {
	return nd[nd[x].fa].son[1] == x; 
}

void connect(int x, int fa, int t) {
	if (x) nd[x].fa = fa; 
	if (fa) nd[fa].son[t] = x; 
}

void pushdown(int x) {
	if (nd[x].rev) { 
		swap(nd[x].son[0], nd[x].son[1]); 
		nd[nd[x].son[0]].rev ^= 1; nd[nd[x].son[1]].rev ^= 1; 
		nd[x].rev = 0; 
	}
}

int update(int x) { nd[x].siz = nd[nd[x].son[0]].siz + nd[nd[x].son[1]].siz + 1; }

void rotate(int x) {
	int f = nd[x].fa, ff = nd[f].fa, t = get(x), tf = get(f), b = nd[x].son[t ^ 1]; 
	connect(x, ff, tf); connect(b, f, t); connect(f, x, t ^ 1); 
	update(f); update(x); 
}

void splay(int x, int u) {
	for (int f = nd[x].fa; f != u; f = nd[x].fa) {
		if (nd[f].fa != u) {
			rotate(get(x) == get(f) ? f : x); 
		}
		rotate(x); 
	}
	if (!u) rt = x; 
}

void find(int x, int idx, int u) { 
	pushdown(x); 
	int s = nd[nd[x].son[0]].siz; 
	if (idx == s + 1) {
		splay(x, u); 
	} else if (idx <= s) {
		find(nd[x].son[0], idx, u); 
	} else {
		find(nd[x].son[1], idx - s - 1, u); 
	}
}

void reverse(int l, int r) {
	find(rt, l - 1, 0); 
	find(rt, r + 1, rt); 
	nd[nd[nd[rt].son[1]].son[0]].rev ^= 1;
}

void print(int x) {
	pushdown(x); 
	if (nd[x].son[0]) print(nd[x].son[0]); 
	if (nd[x].data) printf("%d ", nd[x].data); 
	if (nd[x].son[1]) print(nd[x].son[1]); 
}

int main() {
	n = read(); m = read(); 
	rt = n + 2; 
	for (int i = 1; i <= n + 2; ++i) {
		nd[i].fa = i + 1; 
		nd[i].son[0] = i - 1; 
		nd[i].siz = i; 
	}
	for (int i = 2; i <= n + 1; ++i) {
		nd[i].data = i - 1; 
	}
	nd[rt].fa = 0; 
	while (m--) {
		int l = read(), r = read(); 
		reverse(l + 1, r + 1); 
	}
	print(rt); 
	return 0; 
}

回复

5 条回复,欢迎继续交流。

正在加载回复...