Submission #1204469

#TimeUsernameProblemLanguageResultExecution timeMemory
1204469banganConnecting Supertrees (IOI20_supertrees)C++20
21 / 100
125 ms30244 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define rep(i,l,r) for (int i=(l); i<=(r); i++) const int N = 1e3 + 4; bool vis[N], R[N]; vector<int> A; vector<int> adj[N]; void find_tree(int v) { vis[v]=1; A.pb(v); for (int u : adj[v]) if (!vis[u]) { find_tree(u); } } void find_cyc(int v) { vis[v]=1; A.pb(v); for (int u : adj[v]) if (!vis[u]) find_cyc(u); } int construct(std::vector<std::vector<int>> p) { int n = p.size(); vector ans(n, vector<int>(n)); rep(i, 0, n-1) { if (p[i][i]!=1) return 0; rep(j, 0, n-1) if (p[i][j]!=p[j][i] || p[i][j]==3) return 0; } rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==2) adj[i].pb(j), adj[j].pb(i); rep(i, 0, n-1) if (!vis[i]) { find_cyc(i); if (A.size()==1) {A.clear(); continue;} else if (A.size()==2) return 0; A.pb(A[0]); for (int v:A) for (int u:A) if (v!=u && p[v][u]!=2) return 0; for (int i=0; i+1 < A.size(); i++) ans[A[i]][A[i+1]] = ans[A[i+1]][A[i]] = 1; for (int v:A) R[v]=1; } rep(i, 0, n-1) adj[i].clear(), vis[i]=0; rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==1) adj[i].pb(j), adj[j].pb(i); rep(i, 0, n-1) if (!vis[i]) { find_tree(i); int is_root=0; for (int v:A) is_root += R[v]; if (is_root>1) return 0; for (int v:A) for (int u:A) if (p[v][u]!=1) return 0; for (int i=0; i+1 < A.size(); i++) ans[A[i]][A[i+1]] = ans[A[i+1]][A[i]] = 1; A.clear(); } build(ans); return 1; // rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==1) adj[i].pb(j), adj[j].pb(i); // rep(i, 0, n-1) if (!vis[i]) { // R[i]=i; set_root(i); // for (int v:A) for (int u:A) if (p[v][u]!=1) return 0; // for (int i=0; i+1 < A.size(); i++) ans[A[i]][A[i+1]] = ans[A[i+1]][A[i]] = 1; // A.clear(); // } // rep(i, 0, n-1) adj[i].clear(), vis[i]=0; // rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==2) adj[R[i]].pb(R[j]), adj[R[j]].pb(R[i]); // rep(i, 0, n-1) if (!vis[i]) { // find_cyc(i); // if (A.size()==1) {A.clear(); continue;} // else if (A.size()==2) return 0; // A.pb(A[0]); // vector<int> cyc=A; A.clear(); // for (int v:cyc) for (int u:tree[v]) A.pb(u); // for (int v:A) for (int u:A) if (R[v]!=R[u] && p[v][u]!=2) return 0; // for (int i=0; i+1 < cyc.size(); i++) ans[cyc[i]][cyc[i+1]] = ans[cyc[i+1]][cyc[i]] = 1; // A.clear(); // } }
#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...