結果
問題 |
No.1774 Love Triangle (Hard)
|
ユーザー |
![]() |
提出日時 | 2021-09-25 21:04:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,299 bytes |
コンパイル時間 | 2,030 ms |
コンパイル使用メモリ | 149,068 KB |
最終ジャッジ日時 | 2025-01-24 18:17:19 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 3 |
other | AC * 4 WA * 86 |
ソースコード
// 嘘探索解 #include <algorithm> #include <array> #include <bitset> #include <cassert> #include <chrono> #include <cmath> #include <complex> #include <deque> #include <forward_list> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iostream> #include <limits> #include <list> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <sstream> #include <stack> #include <string> #include <tuple> #include <type_traits> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> using namespace std; using pint = pair<int, int>; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++) #define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) template <typename T> bool chmax(T &m, const T q) { return m < q ? (m = q, true) : false; } template <typename T> bool chmin(T &m, const T q) { return m > q ? (m = q, true) : false; } // UnionFind Tree (0-indexed), based on size of each disjoint set struct UnionFind { std::vector<int> par, cou; UnionFind(int N = 0) : par(N), cou(N, 1) { iota(par.begin(), par.end(), 0); } int find(int x) { return (par[x] == x) ? x : (par[x] = find(par[x])); } bool unite(int x, int y) { x = find(x), y = find(y); if (x == y) return false; if (cou[x] < cou[y]) std::swap(x, y); par[y] = x, cou[x] += cou[y]; return true; } int count(int x) { return cou[find(x)]; } bool same(int x, int y) { return find(x) == find(y); } }; struct rand_int_ { using lint = long long; mt19937 mt; rand_int_() : mt(1837654) {} // fixed lint operator()(lint x) { return this->operator()(0, x); } // [0, x) lint operator()(lint l, lint r) { uniform_int_distribution<lint> d(l, r - 1); return d(mt); } } rnd; int main() { auto START = std::chrono::system_clock::now(); int64_t spent_ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - START).count(); int N, M; cin >> N >> M; vector<tuple<int, int, int>> edges; REP(t, M) { int u, v, w; cin >> u >> v >> w; u--, v--, w--; edges.emplace_back(u, v, w); } vector<int> ret1(M, 0); REP(ntry, 100) { vector<int> ret(M); vector<UnionFind> ufs(M, UnionFind(N)); REP(i, M) { auto [u, v, w] = edges[i]; if (chmax(ret[i], 1)) { UnionFind uf(N); uf.unite(u, v); uf.unite(u, w); ufs[i] = uf; } REP(j, i) { if (ufs[j].same(u, v)) continue; if (ufs[j].same(v, w)) continue; if (ufs[j].same(u, w)) continue; if (ret[j] < ret[i] - 1) continue; if (ret[j] == ret[i] - 1 and rnd(2)) continue; chmax(ret[i], ret[j] + 1); ufs[i] = ufs[j]; ufs[i].unite(u, v); ufs[i].unite(u, w); } } REP(i, M) chmax(ret1[i], ret[i]); } FOR(i, 1, ret1.size()) chmax(ret1[i], ret1[i - 1]); for (auto x : ret1) cout << x << '\n'; }