Submission #1188214

#TimeUsernameProblemLanguageResultExecution timeMemory
1188214anmattroiSimurgh (IOI17_simurgh)C++17
0 / 100
78 ms2628 KiB
#include "simurgh.h" #include <bits/stdc++.h> #define maxn 505 #define fi first #define se second using namespace std; using ii = pair<int, int>; int nho[maxn][maxn]; vector<int> find_roads(int n, vector<int> u, vector<int> v) { int m = u.size(); vector<int> cl(m, 0); for (int i = 0; i < m; i++) nho[u[i]][v[i]] = nho[v[i]][u[i]] = i; for (int o = 0; o < n; o++) { vector<int> indx, suk; vector<int> par(n); iota(par.begin(), par.end(), 0); function<int(int)> find_set = [&](int v) { return par[v] == v ? v : par[v] = find_set(par[v]); }; for (int i = 0; i < m; i++) if (u[i] != o && v[i] != o && find_set(u[i]) != find_set(v[i])) { par[find_set(u[i])] = find_set(v[i]); indx.emplace_back(i); } for (int i = 0; i < n; i++) if (o != i) suk.emplace_back(find_set(i)); sort(suk.begin(), suk.end()); suk.erase(unique(suk.begin(), suk.end()), suk.end()); for (int _i = 0; _i < suk.size(); _i++) { vector<int> indice = indx; for (int i = 0; i < suk.size(); i++) if (i != _i) indice.emplace_back(nho[suk[i]][o]); vector<int> ADJ; for (int i = 0; i < n; i++) if (find_set(i) == suk[_i]) ADJ.emplace_back(nho[o][i]); vector<ii> nho; int cnt = -1, cc = -1; for (int i : ADJ) { if (cl[i] == 1) { cnt = i; continue; } if (cl[i] == -1) { cc = i; continue; } indice.emplace_back(i); nho.emplace_back(i, count_common_roads(indice)); indice.pop_back(); } int mx = 0, dif = 0; for (auto [u, v] : nho) mx = max(mx, v); for (auto [u, v] : nho) if (mx != v) { dif = 1; break; } if (dif) { for (auto [u, v] : nho) { if (v == mx) cl[u] = 1; else cl[u] = -1; } continue; } if (cnt == -1 && cc == -1) { for (auto [u, v] : nho) cl[u] = 1; continue; } if (cnt != -1) { indice.emplace_back(cnt); int T = count_common_roads(indice); for (auto [u, v] : nho) { if (v == T) cl[u] = 1; else cl[u] = -1; } continue; } indice.emplace_back(cc); int T = count_common_roads(indice); for (auto [u, v] : nho) { if (v != T) cl[u] = 1; else cl[u] = -1; } } } vector<int> ans; for (int i = 0; i < m; i++) if (cl[i] == 1) ans.emplace_back(i); return ans; } /* 5 5 0 1 0 2 0 3 0 4 1 4 0 1 2 3 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...