vector<vector<int>> g(n); while (m--) { int u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); }
int q; cin >> q;
vector<array<int, 4>> que(q); for (int i = 0; i < q; i++) { int u, v, e; cin >> u >> v >> e; u--, v--; que[i] = { e + val[u], u, v, i }; } sort(que.begin(), que.end());
DSU dsu(n); vector<int> ans(q); int j = 0; for (int i = 0; i < n; i++) { int u = pos[i]; for (; j < q && que[j][0] < val[u]; j++) { ans[que[j][3]] |= dsu.same(que[j][1], que[j][2]); } for (auto v : g[u]) { if (val[v] <= val[u]) dsu.uno(u, v); } } for (; j < q; j++) { ans[que[j][3]] |= dsu.same(que[j][1], que[j][2]); }
for (int i = 0; i < q; i++) { cout << (ans[i] ? "YES" : "NO") << "\n"; } cout << "\n";
voideachT(){ int n = read(), m = read(), k = read();
vector<vector<pii>> E(k << 2); auto update = [&](thisauto&& self, int l, int r, pii x, int p, int L, int R) { if (l <= L && R <= r) return E[p].push_back(x); if (l < mid) self(l, r, x, lson); if (mid < r) self(l, r, x, rson); }; while (m--) { int u = read(), v = read(), l = read(), r = read(); if (l == r) continue; update(update, l, r, { u, v }, 1, 0, k); }
DSU dsu(2 * n); vector<int> ans(k); auto solve = [&](thisauto&& self, int p, int L, int R) { int h = dsu.history(); for (auto& [u, v] : E[p]) { if (dsu.same(u, v)) return dsu.roll(h); dsu.uno(u, v + n); dsu.uno(v, u + n); } if (R - L == 1) ans[L] = 1; elseself(lson), self(rson); return dsu.roll(h); }; solve(1, 0, k); for (int i = 0; i < k; i++) { printf("%s\n", ans[i] ? "Yes" : "No"); } }
vector<vector<pii>> E(k << 2); auto update = [&](thisauto&& self, int l, int r, pair<int, int> x, int p, int L, int R) { if (l <= L && R <= r) return E[p].push_back(x); if (l < mid) self(l, r, x, lson); if (mid < r) self(l, r, x, rson); }; while (m--) { int u = read(), v = read(), l = read(), r = read(); l--; if (u > v) swap(u, v); update(update, l, r, { u,v }, 1, 0, k); }
DSU dsu(n); auto solve = [&](thisauto&& self, int p, int L, int R) -> void { int h = dsu.history(); for (auto& [u, v] : E[p]) { if (dsu.same(u, v)) continue; dsu.uno(u, v); } if (R - L < 2) dsu.val[dsu.find(1)] += L + 1; elseself(lson), self(rson); return dsu.roll(h); }; solve(1, 0, k);
ll res = 0; for (int i = 1; i <= n; i++) { res ^= dsu.val[i]; } printf("%lld\n", res); }
vector<pair<int, int>> E(m); for (auto& [u, v] : E) { u = read(), v = read(); }
DSU dsu(n << 1); vector<int> ans; auto solve = [&](thisauto&& self, int L, int R) { if (R - L < 2) return ans.push_back(L);
int mid = L + R >> 1; int h = dsu.history(), keep = 1; for (int i = mid; i < R; ++i) { auto& [u, v] = E[i]; if (dsu.same(u, v)) keep = 0; dsu.uno(u, v + n); dsu.uno(u + n, v); } if (keep) self(L, mid); dsu.roll(h);
h = dsu.history(), keep = 1; for (int i = L; i < mid; ++i) { auto& [u, v] = E[i]; if (dsu.same(u, v)) keep = 0; dsu.uno(u, v + n); dsu.uno(u + n, v); } if (keep) self(mid, R); return dsu.roll(h); }; solve(0, m);
printf("%lld\n", ans.size()); for (auto x : ans) printf("%d ", x + 1); printf("\n");
power[0] = 1; for (int i = 1; i < N; i++) { power[i] = power[i - 1] * H; }
int t; cin >> t;
while (t--) { int n, k; cin >> n >> k;
int ocnt[2]{}; // 出点的个数 auto solve = [&](int op) { vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; ocnt[op] += a[i]; }
vector<vector<int>> E(n); int m; cin >> m; while (m--) { int u, v; cin >> u >> v; u--, v--; E[u].push_back(v); }
vector<int> d(n, -1); auto dfs = [&](thisauto&& self, int u) -> void { for (auto v : E[u]) { if (d[v] != -1) continue; d[v] = d[u] + 1; self(v); } }; dfs(0);
// BFS 也可以 // queue<int> Q; // Q.push(0); // d[0] = 0; // while (!Q.empty()) { // int u = Q.front(); Q.pop(); // for (auto v : E[u]) { // if (d[v] == -1) { // d[v] = d[u] + 1; // Q.push(v); // } // } // }
vector<int> cnt(2 * k); for (int i = 0; i < n; i++) { cnt[(d[i] + a[i]) % k] += (a[i] ^ op) ? 1 : n; } for (int i = 0; i < k; i++) { cnt[i + k] = cnt[i]; // 倍长 } returnHash(cnt); };
auto L = solve(0); auto R = solve(1); bool ok = false; for (int i = 0; i < k; i++) { if (L(0, k) == R(i, i + k)) { ok = true; } } if (ocnt[0] == n || ocnt[1] == n) ok = true; // 特判只有一种方向的边 没有增加环的数量 一定可行 if (ocnt[0] + ocnt[1] != n) ok = false; // 特判出入点数量不同
for (int i = 1; i <= n; ++i) { dist[i][i] = 0; for (int j = 1; j <= n; ++j) dist[i][j] = dist[j][i] = read(); } for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) l[i][j] = l[j][i] = read();
auto floyd = [&] { for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) dist2[i][j] = min(dist2[i][j], dist2[i][k] + dist2[k][j]); ll ans = 0; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) ans += dist2[i][j]; return ans; };
auto check = [&](int x) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) dist2[i][j] = max(l[i][j], dist[i][j] - x * 2); } returnfloyd() > need; };