제출 #1235082

#제출 시각아이디문제언어결과실행 시간메모리
1235082badge881슈퍼트리 잇기 (IOI20_supertrees)C++20
100 / 100
118 ms22288 KiB
#ifndef HOME #include "supertrees.h" #endif #include <vector> using namespace std; class DSU { vector<int> bosses, sz; public: DSU(int n) { bosses.resize(n + 1); sz.resize(n + 1); for (int i = 0; i < n; i++) bosses[i] = i, sz[i] = 1; } int boss(int u) { return bosses[u] == u ? u : bosses[u] = boss(bosses[u]); } bool merge(int u, int v) { int ru = boss(u), rv = boss(v); if (ru == rv) return 0; if (sz[ru] > sz[rv]) swap(sz[ru], sz[rv]); bosses[ru] = rv; sz[rv] += sz[ru]; return 1; } }; int construct(vector<vector<int>> p) { int n = p[0].size(); vector<vector<int>> v(n, vector<int>(n, 0)); DSU ufd1(n), ufd2(n); for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (p[i][j] != 0) ufd1.merge(i, j); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (p[i][j] == 0 && ufd1.boss(i) == ufd1.boss(j)) return 0; else if (p[i][j] == 1) ufd2.merge(i, j); else if (p[i][j] == 3) return 0; vector<vector<int>> comp(n), comp1(n); for (int i = 0; i < n; i++) { comp[ufd2.boss(i)].push_back(i); if (ufd2.boss(i) == i) comp1[ufd1.boss(i)].push_back(i); } for (int i = 0; i < n; i++) if (ufd2.boss(i) == i) for (int j = 1; j < comp[i].size(); j++) v[comp[i][j - 1]][comp[i][j]] = v[comp[i][j]][comp[i][j - 1]] = 1; for (int i = 0; i < n; i++) { if (ufd1.boss(i) != i) continue; if (comp1[i].size() == 2) return 0; if (comp1[i].size() > 1) { for (int j = 0; j < comp1[i].size(); j++) { int u = comp1[i][j], v1 = comp1[i][(j + 1) % comp1[i].size()]; v[u][v1] = v[v1][u] = 1; } } } #ifndef HOME build(v); #endif 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...