Submission #150150

#TimeUsernameProblemLanguageResultExecution timeMemory
150150お前はもう死んでいる (#200)Lokahian Relics (FXCUP4_lokahia)C++17
0 / 100
13 ms896 KiB
#include "lokahia.h" #include <bits/stdc++.h> using namespace std; const int N = 205; random_device rd; mt19937_64 mt(rd()); int n, dsu[N], con[N][N]; vector<int> ve[N]; int rand(int l, int r) { uniform_int_distribution<int> uni(l, r); return uni(mt); } int trace(int u) { return dsu[u] < 0 ? u : dsu[u] = trace(dsu[u]); } int connect(int u, int v) { if ((u = trace(u)) == (v = trace(v))) return -1; if (dsu[u] > dsu[v]) swap(u, v); dsu[u] += dsu[v]; dsu[v] = u; vector<int> tmp; for (int j = 1; j <= n; j++) if (con[u][j] == -1 || con[v][j] == -1) tmp.push_back(j); for (int &a : ve[u]) for (int &b : ve[v]) con[a][b] = con[b][a] = 1; for (int &b : ve[v]) ve[u].push_back(b); ve[v].clear(); for (int &a : ve[u]) for (int &b : tmp) con[a][b] = con[b][a] = -1; if (-dsu[u] > n / 2) return u; return -1; } int FindBase(int _n) { n = _n; for (int i = 0; i < n; i++) { dsu[i] = -1; ve[i] = {i}; con[i][i] = 1; } for (int i = 1; i <= 300; i++) { int u, v, cnt = 0; do { u = rand(0, n - 1); v = rand(0, n - 1); cnt++; } while (con[u][v] != 0 && cnt <= 10); if (cnt > 10) break; u = trace(u); v = trace(v); int rt = CollectRelics(u, v); if (rt == -1) { for (int &a : ve[u]) for (int &b : ve[v]) con[a][b] = con[b][a] = -1; } else { connect(rt, u); int tmp = connect(rt, v); if (tmp >= 0) return tmp; } } for (int i = 0; i < n; i++) if (-dsu[i] > n / 2) return i; return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...