求助
  • 板块灌水区
  • 楼主pengbonan
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/8 08:03
  • 上次更新2024/6/8 11:22:55
查看原帖
求助
1005693
pengbonan楼主2024/6/8 08:03

题

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int n, m, x, y;
int lc[N], rc[N], dist[N], fa[N];
bool tf[N];
struct node {
	int id, v;
	bool operator < (const node &x) {
		if (v == x.v) return id < x.id;
		return v < x.v;
	}
} v[N];
int find (int x) {
	if (fa[x] == x) return x;
	else return fa[x] = find(fa[x]);
}
int merge (int x, int y) {
	if (!x || !y) return x | y;
	if (v[y] < v[x]) swap(x, y);
	rc[x] = merge(rc[x], y);
	if (dist[lc[x]] < dist[rc[x]]) swap(lc[x], rc[x]);
	dist[x] = dist[rc[x]] + 1;
	return x;
}
int weak (int x) {
	v[x].v >>= 1;
	int root = merge(lc[x], rc[x]);
	lc[x] = rc[x] = dist[x] = 0;
	return fa[root] = fa[x] = merge(root, x);
}
int main () {
	while (cin >> n) {
		dist[0] = -1;
		for (int i = 1; i <= n; i ++) {
			lc[i] = rc[i] = dist[i] = 0;
			cin >> v[i].v;
			fa[i] = v[i].id = i;
		}
		cin >> m;
		for (int i = 1; i <= m; i ++) {
			cin >> x >> y;
			x = find(x);
			y = find(y);
			if (x == y) { cout << "-1\n"; continue; }
			int a = weak(x), b = weak(y);
			fa[a] = fa[b] = merge(a, b);
			cout << v[fa[a]].v << '\n';
		}
	}
	return 0;
}

样例过不去

2024/6/8 08:03
加载中...