splay样例错了求调
查看原帖
splay样例错了求调
716260
SegmentTree_楼主2024/6/22 18:05

输出3 1 2 4 3 5

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lid (id << 1)
#define rid (id << 1 | 1)
const int N = 1e5+5;
/*
二叉搜索树,又称二叉搜索树,
是一种优化查询数字的复杂度的
数据结构,他的结点严格满足左

结点小于根节点,右结点大于根节点
son[0]左儿子 son[1]右儿子
val 值
cnt 有多少个这个值
siz 所在子树元素个数
fa 父节点
*/
struct node{
	int son[2];
	int val;
	int cnt;
	int siz;
	int fa;
	int tag;
}tr[2000005];
int root, tot;
int n, m;
int a[N];
bool Dir(int x){
	return tr[tr[x].fa].son[1] == x;
}
void pushup(int x){
	tr[x].siz = tr[tr[x].son[0]].siz + tr[tr[x].son[1]].siz + tr[x].cnt;
}
void pushdown(int x){
	if (x && tr[x].tag){
		tr[tr[x].son[0]].tag ^= 1;
		tr[tr[x].son[1]].tag ^= 1;
		swap(tr[x].son[0], tr[x].son[1]);
		tr[x].tag = 0;
	}
}
void rorate(int x){
	int y = tr[x].fa, z = tr[y].fa, k = Dir(x), w = tr[x].son[k ^ 1];
	pushdown(x), pushdown(y);
	tr[z].son[Dir(y)] = x;tr[x].fa = z;
	tr[x].son[k ^ 1] = y;tr[y].fa = x;
	tr[y].son[k] = w;tr[w].fa = y;
	pushup(x);pushup(y);
}
void splay(int x, int goal = 0){
	while (tr[x].fa != goal){
		int y = tr[x].fa, z = tr[y].fa;
		if (z != goal){
			if (Dir(x) == Dir(y)) rorate(y);
			else rorate(x);
		}
		rorate(x);
	}
	if (!goal) root = x;
}
void find(int x){
	if (!root) return;
	int cur = root;
	while (tr[cur].son[x > tr[cur].val] && tr[cur].val != x){
		pushdown(cur);
		cur = tr[cur].son[x > tr[cur].val];
	}
	splay(cur);
}
void rev(int l, int r){
	int a = l - 1, b = r + 1;
	find(a), a = root;
	find(b), b = root;
	splay(a), splay(b, a);
	int cur = tr[root].son[1];
	cur = tr[cur].son[0];
	tr[cur].tag ^= 1;
}
void print(int x){
	pushdown(x);
	if (tr[x].son[0])print(tr[x].son[0]);
	int tmp = tr[x].val;
	if (tmp >= 1 && tmp <= n) cout << tmp << ' ';
	if (tr[x].son[1]) print(tr[x].son[1]); 
}
void build(int &k, int l, int r, int f){
	if (l > r){
		k = 0;
		return;
	}
	int mid = (l + r) >> 1;
	k = ++tot;
	tr[k].siz = tr[k].cnt = 1;
	tr[k].fa = f;
	tr[k].val = a[mid];
	build(tr[k].son[0], l, mid - 1, k);
	build(tr[k].son[1], mid + 1, r, k);
	pushup(k);
}
int main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	a[1] = -INT_MAX, a[n + 2] = INT_MAX;
	for (int i = 2;i <= n + 1;i++) a[i] = i - 1;
	build(root, 1, n + 2, 0);
	//print(root);
	while (m--){
		int l, r;
		cin >> l >> r;
		rev(l, r);
	}
	print(root);
	return 0;
}
2024/6/22 18:05
加载中...