求助
  • 板块学术版
  • 楼主Samuel_YHL
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/5/10 19:18
  • 上次更新2023/11/4 23:25:48
查看原帖
求助
122000
Samuel_YHL楼主2021/5/10 19:18

配对堆板子,WA65

#include <cstdio>
#include <algorithm>
#define N 100010
#define fo(i, a, b) for (int i = a; i <= b; ++i)
using namespace std;
struct node
{
	int w, id, ch, br;
}ph[N];
int fa[N], bz[N];
int find(int a)
{
	if (fa[a] != a)
		fa[a] = find(fa[a]);
	return fa[a];
}
int merge(int a, int b)
{
	if (!a) return a;
	if (!b) return b;
	if (ph[b].w < ph[a].w || (ph[b].w == ph[a].w && ph[b].id < ph[a].id))
		swap(a, b);
	ph[b].br = ph[a].ch;
	ph[a].ch = b;
	int fb = find(b), ff = find(a);
	fa[fb] = fa[ff];
	return a;
}
int merges(int x)
{
	if (!x || !ph[x].br)
		return x;
	int a = ph[x].br;
	int b = ph[a].br;
	ph[a].br = ph[x].br = 0;
	fa[a] = a; fa[x] = x;
	return merge(merge(x, a), merges(b));
}
int main()
{
//	freopen("lg.in", "r", stdin);
//	freopen("lg.out", "w", stdout);
	int n, m;
	scanf("%d%d", &n, &m);
	fo (i, 1, n)
	{
		scanf("%d", &ph[i].w);
		ph[i].id = i;
		fa[i] = i;
	}
	fo (i, 1, m)
	{
		int op;
		scanf("%d", &op);
		if (op == 1)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			int fx = find(x), fy = find(y);
			if (!bz[x] && !bz[y] && fx != fy)
				merge(fx, fy);
		}
		else
		{
			int x;
			scanf("%d", &x);
			if (!bz[x])
			{
				int fx = find(x);
				printf("%d\n", ph[fx].w);
				bz[fx] = 1;
				fa[fx] = ph[fx].ch;
				fa[ph[fx].ch] = ph[fx].ch; 
				merges(ph[fx].ch);
			}
			else
				printf("-1\n");
		}
	}
	return 0;
}
2021/5/10 19:18
加载中...