제출 #1139286

#제출 시각아이디문제언어결과실행 시간메모리
1139286fryingduc슈퍼트리 잇기 (IOI20_supertrees)C++20
100 / 100
119 ms22176 KiB
#include "supertrees.h" #include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif const int maxn = 1005; bool vis[maxn]; vector<vector<int>> g; void add(int u, int v) { g[u][v] = g[v][u] = 1; } int construct(std::vector<std::vector<int>> p) { int n = (int)p.size(); g.resize(n, vector<int>(n)); for(int root = 0; root < n; ++root) { if(vis[root]) continue; vector<int> adj; for(int j = 0; j < n; ++j) { if(p[root][j]) { if(vis[j]) return 0; adj.push_back(j); } } if((int)adj.size() == 1) { continue; } vector<bool> in_comp(n); for(auto i:adj) in_comp[i] = 1; for(auto i:adj) { for(int j = 0; j < n; ++j) { if((!!p[i][j]) ^ in_comp[j]) { debug(i, j); return 0; } } } vector<bool> has(4); for(int i = 1; i < (int)adj.size(); ++i) { for(int j = 0; j < i; ++j) { if(!p[adj[i]][adj[j]]) return 0; has[p[adj[i]][adj[j]]] = 1; } } if(has[2] and has[3]) return 0; for(auto &i:adj) { vis[i] = 1; } int sz = (int)adj.size(); vector<int> cyc; vector<int> dark; for(int i = 0; i < sz; ++i) { bool flag = 0; for(int j = 0; j < sz; ++j) { if(i == j) continue; if(p[adj[i]][adj[j]] == 1) { flag = 1; break; } } if(flag) { dark.push_back(adj[i]); } else { cyc.push_back(adj[i]); } } vector<int> riel((int)dark.size()); int trees = 0; for(int i = 0; i < (int)dark.size(); ++i) { if(riel[i]) continue; riel[i] = ++trees; for(int j = 0; j < (int)dark.size(); ++j) { if(i == j) continue; if(p[dark[i]][dark[j]] == 1) { if(riel[j]) return 0; add(dark[j], dark[i]); riel[j] = trees; } } cyc.push_back(dark[i]); } for(int i = 0; i < (int)dark.size(); ++i) { for(int j = 0; j < i; ++j) { if(p[dark[i]][dark[j]] == 1 and riel[i] != riel[j]) { return 0; } } } if(has[2] || has[3]) { if(has[3]) return 0; if((int)cyc.size() <= 2) { return 0; } for(int i = 0; i < (int)cyc.size(); ++i) { add(cyc[i], cyc[(i + 1) % (int)cyc.size()]); } if(has[3]) { if((int)cyc.size() <= 3) { return 0; } add(cyc[0], cyc[2]); } for(int i = 1; i < (int)cyc.size(); ++i) { for(int j = 0; j < i; ++j) { if(p[cyc[i]][cyc[j]] <= 1) { return 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...