Submission #1204473

#TimeUsernameProblemLanguageResultExecution timeMemory
1204473banganConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
125 ms30356 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; int R[N]; bool vis[N]; vector<int> A; vector<int> adj[N], tree[N]; void set_root(int v) { vis[v]=1; A.pb(v); tree[R[v]].pb(v); for (int u : adj[v]) if (!vis[u]) { R[u]=R[v]; set_root(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]==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 || p[u][v]!=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] && R[i]==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(); } build(ans); 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...