疑问
查看原帖
疑问
705435
Velkhana楼主2023/11/14 19:56

我的这个代码里的to_union()函数里的tx<ty改成大于就T了,不应该是把深度小的接在深度大的下面吗¿还是哪里写错了

TLE记录

#include <cstdio>
#define swap(A, B) (A ^= B ^= A ^= B)

const int MX = 100010, MXM = 200010, MXND = 10800010;

int read()
{
	char c = getchar();
	while (c < '0' or '9' < c)
	{
		c = getchar();
	}
	int ret = 0;
	while ('0' <= c and c <= '9')
	{
		ret = (ret << 3) + (ret << 1) + c - '0';
		c = getchar();
	}
	return ret;
}

void write(int num)
{
	if (num >= 10)
	{
		write(num / 10);
	}
	putchar(num % 10 + '0');
}

struct p_arr
{
private:
	struct node
	{
		int ls, rs;
	};
	
	static node tree[MXND];
	static int len, tot;
	int v[MXM], now;
	
	static int update(int p, int x, int val, int cl = 1, int cr = len)
	{
		if (cl == cr)
		{
			tree[++tot].rs = val;
			return tot;
		}
		else
		{
			int mid = (cl + cr) >> 1, ret = ++tot;
			if (x <= mid)
			{
				tree[ret].ls = update(tree[p].ls, x, val, cl, mid);
				tree[ret].rs = tree[p].rs;
			}
			else
			{
				tree[ret].ls = tree[p].ls;
				tree[ret].rs = update(tree[p].rs, x, val, mid + 1, cr);
			}
			return ret;
		}
	}
	
	static int query(int p, int x, int cl = 1, int cr = len)
	{
		if (cl == cr)
		{
			return tree[p].rs;
		}
		else
		{
			int mid = (cl + cr) >> 1;
			if (x <= mid)
			{
				return query(tree[p].ls, x, cl, mid);
			}
			else
			{
				return query(tree[p].rs, x, mid + 1, cr);
			}
		}
	}
	
public:
	static void initl(int l)
	{
		len = l;
	}
	
	static int build(int p, int l, int r, int a(int))
	{
		if (l == r)
		{
			tree[p].rs = a(l);
		}
		else
		{
			int mid = (l + r) >> 1;
			tree[p].ls = ++tot;
			build(tot, l, mid, a);
			tree[p].rs = ++tot;
			build(tot, mid + 1, r, a);
		}
	}
	
	void set(int idx, int val)
	{
		v[now] = update(v[now], idx, val);
	}
	
	void setv(int idx, int from)
	{
		now = idx;
		v[idx] = v[from];
	}
	
	int operator[] (int idx)
	{
		return query(v[now], idx);
	}
} fa, dep;

int p_arr::len, p_arr::tot;
p_arr::node p_arr::tree[MXND];

void init(int p, int n)
{
	p_arr::build(p, 1, n, [] (int idx)
	{
		return idx;
	});
}

int find(int x)
{
	int fath = fa[x];
	if (fath == x)
	{
		return x;
	}
	else
	{
		return find(fath);
	}
}

bool in_union(int a, int b)
{
	return find(a) == find(b);
}

void to_union(int a, int b)
{
	int x = find(a), y = find(b);
	if (x != y)
	{
		int tx = dep[x], ty = dep[y];
		if (tx < ty)
		{
			swap(x, y);
		}
		fa.set(x, y);
		if (tx == ty)
		{
			dep.set(y, ty + 1);
		}
	}
}

int main()
{
	int n, m, op, a, b;
	n = read();
	m = read();
	p_arr::initl(n);
	init(0, n);
	for (int i = 1; i <= m; i++)
	{
		op = read();
		fa.setv(i, i - 1);
		dep.setv(i, i - 1);
		if (op == 1)
		{
			a = read();
			b = read();
			to_union(a, b);
		}
		else if (op == 2)
		{
			a = read();
			fa.setv(i, a);
			dep.setv(i, a);
		}
		else
		{
			a = read();
			b = read();
			putchar(in_union(a, b) ? '1' : '0');
			putchar('\n');
		}
	}
}
2023/11/14 19:56
加载中...