Splay在线求调!!!全WA!!!
  • 板块学术版
  • 楼主zjc2008
  • 当前回复18
  • 已保存回复18
  • 发布时间2023/4/29 16:24
  • 上次更新2023/10/23 17:15:22
查看原帖
Splay在线求调!!!全WA!!!
376103
zjc2008楼主2023/4/29 16:24
#include<bits/stdc++.h>
using namespace std;
int n , m;
struct node{
	int s[2] , p , v;
	int siz , tag;
	void init(int _v , int _p)
	{
		v = _v;
		p = _p;
		siz = 1;
	}
}tr[100005];

int root , idx;

void pushup(int p)
{
	tr[p].siz = tr[tr[p].s[0]].siz + tr[tr[p].s[1]].siz + 1;
}

void pushdown(int p)
{
	if(tr[p].tag)
	{
		swap(tr[p].s[0] , tr[p].s[1]);
		tr[tr[p].s[0]].tag ^= 1;
		tr[tr[p].s[1]].tag ^= 1;
		tr[p].tag = 0;
	}
}

void rotate(int x)
{
	int y = tr[x].p;
	int z = tr[y].p;
	int k = (tr[y].s[1] == x);
	tr[z].s[tr[z].s[1] == y] = x,tr[x].p = z;
	tr[y].s[k] = tr[x].s[k ^ 1] , tr[tr[x].s[k ^ 1]].p = y;
	tr[x].s[k ^ 1] = y , tr[y].p = x;
	pushup(y); pushup(x);
}

void splay(int x , int k)
{
	while(tr[x].p != k)
	{
		int y = tr[x].p;
		int z = tr[y].p;
		if(z != k)
		{
			if((tr[z].s[1] == y) ^ (tr[y].s[1] == x))rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if(!k)root = x;
}

void insert(int v)
{
	int u = root , p = 0;
	while(u)p = u , u = tr[u].s[v > tr[u].v];
	u = ++idx;
	if(p)tr[p].s[v > tr[p].v] = u;
	tr[u].init(v , p);
	splay(u , 0);
}

int get_k(int v)
{
	int u = root;
	while(1)
	{
		pushdown(u);
		if(tr[tr[u].s[0]].siz >= v)u = tr[u].s[0];
		if(tr[tr[u].s[0]].siz + 1 == v)return u;
		if(tr[tr[u].s[0]].siz + 1 < v)v -= tr[tr[u].s[0]].siz + 1 , u = tr[u].s[1];
	}
	return -1;
}

void output(int p)
{
	pushdown(p);
	if(tr[p].s[0])output(tr[p].s[0]);
	if(tr[p].v >0 && tr[p].v <= n)cout << tr[p].v << ' ';
	if(tr[p].s[1])output(tr[p].s[1]);
}

int main()
{
	cin >> n >> m;
	for(int i = 0;i <= n + 1;i++)insert(i);
	while(m--)
	{
		int l , r;
		cin >> l >> r;
		int x = get_k(l) , y = get_k(r + 2);
		splay(x , 0) , splay(y , x);
		tr[tr[y].s[0]].tag ^= 1;
	}
	output(root);
	return 0;
 } 
2023/4/29 16:24
加载中...