80Pts求调QWQ
查看原帖
80Pts求调QWQ
1698594
QC1919810楼主2025/7/21 11:04
#include<stdio.h>
#define Mx 500005
struct N
{
	int l,w,r;
} l[Mx];
int f=-1,n=0,h=-1;
int Ir(int w, int i)
{
	if (f == -1 && n >= Mx)
		return -1;
	int x = f;
	if (x != -1)
		f = l[x].r;
	else
		x = n++;
	l[x].w = w;
	if (i ==-1)
	{
		l[x].l = x;
		l[x].r = x;
		h = x;
	}
	else
	{
		int j = l[i].r;
		l[x].l = i;
		l[x].r = j;
		l[i].r = x;
		l[j].l = x;
		if (i == l[h].l)
			h = x;
	}
	return x;
}
int Dt(int i)
{
	if (i<0||i>=n||h==-1)
		return -1;
	int p = l[i].l;
	l[p].r = l[i].r;
	l[l[i].r].l = p;
	if (i == h)
	{
		if (p == i)
			h = -1;
		else
			h = l[i].r;
	}
	l[i].r = f;
	f = i;
	return p;
}
int d[Mx];
int main(void)
{
	int N, M;
	scanf("%d%d", &N, &M);
	d[1] = Ir(1, -1);
	for (int i = 2; i <= N; ++i)
		d[i] = Ir(i, d[i-1]);
	for (int i=1,p,x,y,w; i <= M; ++i)
	{
		scanf("%d", &p);
		switch (p)
		{
			case 1:
				scanf("%d%d", &x, &y);
				w = l[d[x]].w;
				Dt(d[x]);
				d[x] = Ir(w, l[d[y]].l);
				break;
			case 2:
				scanf("%d%d", &x, &y);
				w = l[d[x]].w;
				Dt(d[x]);
				d[x]=Ir(w, d[y]);
				break;
			case 3:
				scanf("%d", &x);
				Dt(d[x]);
				break;
		}
	}
	int i=h;
	if (h == -1)
		printf("Empty!");
	else
		do
			printf("%d ", l[i].w),i=l[i].r;
		while (i!=h);
	return 0;
}
2025/7/21 11:04
加载中...