Submission #1279007

#TimeUsernameProblemLanguageResultExecution timeMemory
1279007IBoryConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
130 ms26160 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; const int MAX = 1004; vector<int> A[MAX], B[MAX]; struct UF { int R[MAX]; UF() { iota(R, R + MAX, 0); } int Find(int n) { if (n == R[n]) return n; return R[n] = Find(R[n]); } void Union(int a, int b) { a = Find(a), b = Find(b); if (a == b) return; R[a] = b; } } UF1, UF2; int construct(vector<vector<int>> P) { int N = P.size(); for (auto& v : P) for (int n : v) if (n == 3) return 0; for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) { if (P[i][j]) UF2.Union(i, j); if (P[i][j] == 1) UF1.Union(i, j); } bool ok = 1; for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) { if (UF2.Find(i) != UF2.Find(j)) ok &= (P[i][j] == 0); else if (UF1.Find(i) != UF1.Find(j)) { ok &= (P[i][j] == 2); B[UF2.Find(i)].push_back(UF1.Find(j)); } else { ok &= (P[i][j] == 1); A[UF1.Find(i)].push_back(j); } } if (!ok) return 0; for (int i = 0; i < N; ++i) { sort(A[i].begin(), A[i].end()); A[i].erase(unique(A[i].begin(), A[i].end()), A[i].end()); sort(B[i].begin(), B[i].end()); B[i].erase(unique(B[i].begin(), B[i].end()), B[i].end()); } vector<vector<int>> G(N, vector<int>(N, 0)); for (int i = 0; i < N; ++i) { for (int n : A[i]) G[i][n] = G[n][i] = 1; if (B[i].empty()) continue; if (B[i].size() == 2) return 0; B[i].push_back(i); for (int j = 0; j < B[i].size(); ++j) { int a = B[i][j], b = B[i][(j + 1) % B[i].size()]; G[a][b] = G[b][a] = 1; } } for (int i = 0; i < N; ++i) G[i][i] = 0; build(G); return 1; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...