92pts玄关,WA on #12,码风良好,求调
查看原帖
92pts玄关,WA on #12,码风良好,求调
1266620
duxingpeng楼主2025/7/27 00:42
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
const ll N = 1e7 + 5;
struct node
{
	ll val;
	ll rnk;
	bool operator < (const node& x)
	const
	{
		if(val == x.val)
			return rnk < x.rnk;
		return val < x.val;
	}
};
ll n;
ll q;
ll fa[N] = {};
ll ls[N] = {};
ll rs[N] = {};
ll dis[N] = {};
bitset <N> del;
node t[N];
inline ll read()
{
	ll x = 0;
	ll y = 1;
	char c = getchar();
	while(c < '0' || c > '9')
	{
		if(c == '-')
			y = -y;
		c = getchar();
	}
	while(c >= '0' && c <= '9')
	{
		x = (x << 3) + (x << 1) + (c ^ '0');
		c = getchar();
	}
	return x * y;
}
inline void write(ll x)
{
	if(x < 0)
	{
		putchar('-');
		write(-x);
		return;
	}
	if(x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}
inline ll find(ll x)
{
	if(x == fa[x])
		return x;
	return fa[x] = find(fa[x]);
}
inline ll merge(ll x,ll y)
{
	if(!x || !y)
		return x + y;
	if(t[x].val > t[y].val)
		swap(x,y);
	rs[x] = merge(rs[x],y);
	if(dis[rs[x]] > dis[ls[x]])
		swap(ls[x],rs[x]);
	dis[x] = dis[rs[x]] + 1;
	return x;
}
int main()
{
	dis[0] = -1;
	n = read();
	q = read();
	rep(i,1,n)
	{
		fa[i] = i;
		t[i].rnk = i;
		t[i].val = read();
	}
	rep(k,1,q)
	{
		ll opt = 0;
		opt = read();
		if(opt == 1)
		{
			ll x = 0;
			ll y = 0;
			x = read();
			y = read();
			if(del[x] || del[y])
				continue;
			x = find(x);
			y = find(y);
			if(x == y)
				continue;
			fa[x] = merge(x,y);
			fa[y] = fa[x];
		}
		else if(opt == 2)
		{
			ll x = 0;
			x = read();
			if(del[x])
			{
				write(-1);
				putchar('\n');
				continue;
			}
			x = find(x);
			write(t[x].val);
			putchar('\n');
			del[x] = true;
			fa[x] = merge(ls[x],rs[x]);
			fa[ls[x]] = fa[x];
			fa[rs[x]] = fa[x];
			ls[x] = 0;
			rs[x] = 0;
			dis[x] = 0;
		}
	}
	return 0;
}

应该是-1的特判有问题,但调了好久蒟蒻真的调不动了,求大佬解救qwq

2025/7/27 00:42
加载中...