ABC F 求调
  • 板块学术版
  • 楼主lottle1212
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/11 21:50
  • 上次更新2023/11/11 23:52:36
查看原帖
ABC F 求调
765958
lottle1212楼主2023/11/11 21:50

WA 了几个点,用并查集写,应该不难看懂。

#include <iostream>
#define int long long
#define pr pair <int, int>
using namespace std;
const int N = 2e5 + 10;
int n, q, f[N], add[N], mor[N], val[N]; bool unu[N];
int rd() {
	int res = 0; bool f = 0; char ch = getchar();
	while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
	while (ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = getchar();
	return f ? -res : res;
}
pr get_fa(int x) {
	if (x == f[x]) return make_pair(x, 0);
	pr tmp = get_fa(f[x]); f[x] = tmp.first, mor[x] += tmp.second;
	return make_pair(f[x], mor[x]);
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	n = rd(), q = rd();
	for (int i = 1; i <= n; ++ i) f[i] = i, unu[i] = true;
	for (int i = 1; i <= q; ++ i) {
		int v = rd(), u = rd(), w = rd(); pr fx = get_fa(u), fy = get_fa(v); bool flag = true;
		int fu = fx.first, mu = fx.second, fv = fy.first, mv = fy.second;
		if (u == v) {
			if (! w) cout << i << ' ';
			continue;
		}
		if (unu[u]) f[u] = v, val[u] = val[v] + mv + add[fv] - w;
		else if (unu[v]) f[v] = u, val[v] = val[u] + mu + add[fu] + w;
		else if (val[u] + mu + add[fu] + w != val[v] + mv + add[fv]) {
			if (fu == fv) flag = false;
			else add[fv] = val[u] + mu + add[fu] + w - val[v] - mv, mor[fv] += add[fv], f[fv] = fu;
		}
		unu[u] = unu[v] = false;
		if (flag) cout << i << ' ';
	}
	return 0;
}
2023/11/11 21:50
加载中...