結果
問題 | No.2912 0次パーシステントホモロジー |
ユーザー |
![]() |
提出日時 | 2024-10-04 21:52:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 189 ms / 2,000 ms |
コード長 | 1,886 bytes |
コンパイル時間 | 2,377 ms |
コンパイル使用メモリ | 207,404 KB |
最終ジャッジ日時 | 2025-02-24 15:13:44 |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 23 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;#define ALL(v) v.begin(),v.end()#define dbg(x) cerr << #x << ": " << (x) << endl;struct UnionFind {UnionFind(int n): par(n), rank(n, 1) {iota(par.begin(), par.end(), 0);}// 頂点xの根ノードint root(int x) {if (par[x] == x) return x;return par[x] = root(par[x]);}// 結合bool unite(int x, int y) {x = root(x);y = root(y);if (x == y) return false;if (rank[x] > rank[y]) swap(x,y);if (rank[x] == rank[y]) ++rank[y];par[x] = y;return true;}// 頂点xと頂点yが同じ集合ならtruebool same(int x, int y) {return root(x) == root(y);}vector<vector<int>> groups() {vector<vector<int>> gr(par.size());for (int v = 0; v < par.size(); ++v) {gr[root(v)].push_back(v);}vector<vector<int>> res;for (int v = 0; v < (int)par.size(); ++v) {if (gr[v].size()) res.push_back(gr[v]);}return res;}vector<int> par, rank;};int n,m;vector<vector<pair<int,int>>> e(1e5 + 1);int t;vector<int> q;int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {int a,b,c;cin >> a >> b >> c;e[c].emplace_back(a,b);}cin >> t;q.resize(t);for (int i = 0; i < t; ++i) cin >> q[i];vector<int> idx(t);iota(ALL(idx), 0);sort(ALL(idx), [&](int i, int j) {return q[i] < q[j];});UnionFind uf(n);vector<int> ans(t);int cnt = n;int end = 0;for (int qi : idx) {for (int i = end; i <= q[qi]; ++i) {for (auto [u,v] : e[i]) {if (uf.unite(u,v)) {--cnt;}}}end = q[qi];ans[qi] = cnt;}for (int i : ans) {cout << i << '\n';}}