Submission #150098

#TimeUsernameProblemLanguageResultExecution timeMemory
150098お前はもう死んでいる (#200)Lokahian Relics (FXCUP4_lokahia)C++17
0 / 100
3099 ms848 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]); } void connect(int u, int v) { if ((u = trace(u)) == (v = trace(v))) return; 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; } 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; do { u = rand(0, n - 1); v = rand(0, n - 1); } while (con[u][v] != 0); 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); connect(rt, v); } } for (int i = 0; i < n; i++) if (-dsu[i] >= n / 2) return i; return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...