제출 #1313257

#제출 시각아이디문제언어결과실행 시간메모리
1313257ayaz슈퍼트리 잇기 (IOI20_supertrees)C++20
11 / 100
90 ms22012 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define isz(x) (int)x.size() #define all(x) (x).begin(), (x).end() using vi = vector<int>; using vvi = vector<vector<int>>; struct DSU { vi p, sz; int n, compo; void init(int _n) { n = _n; compo = n; p.resize(n + 1); sz.resize(n + 1, 1); for (int i = 1; i <= n; i++) p[i] = i; } int getpar(int x) { if (p[x] != x) p[x] = getpar(p[x]); return p[x]; } void connect(int x, int y) { int a = getpar(x); int b = getpar(y); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); p[b] = a; sz[a] += sz[b]; } bool same(int x, int y) { return getpar(x) == getpar(y); } }; vvi g; int construct(vvi p) { int n = p.size(); g.resize(n, vector<int>(n, 0)); for (int i = 0; i < 1; i++) { int cnt2 = 0, cnt3 = 0; for (int j = 0; j < n; j++) { if (p[i][j] == 2) cnt2++; if (p[i][j] == 3) cnt3++; } // if (cnt2 == 1 || (cnt3 && cnt3 <= 2)) return 0; // if (cnt2 > 0 && cnt3 > 0) return 0; vector<int> nodes; for (int j = 0; j < n; j++) { if (p[i][j] == 0 && g[i][j] == 1) return 0; if (p[i][j] == 0 || i == j) continue; if (p[i][j] == 1) { g[i][j] = 1; g[j][i] = 1; continue; } nodes.push_back(j); } if (nodes.empty()) continue; for (auto to : nodes) { g[i][to] = 1; g[to][i] = 1; } for (int j = 1; j < isz(nodes); j++) { g[nodes[j]][nodes[j - 1]] = 1; g[nodes[j - 1]][nodes[j]] = 1; } for (int j = 0; j < n; j++) { if (p[i][j] < 2) continue; if (count(all(nodes), j) == 0) { g[nodes.back()][j] = 1; g[j][nodes.back()] = 1; } } } 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...