Submission #347921

#TimeUsernameProblemLanguageResultExecution timeMemory
347921evnConnecting Supertrees (IOI20_supertrees)C++14
21 / 100
274 ms22124 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define f first #define s second #define pb push_back #define mp make_pair typedef long long ll; typedef pair<int, int> pii; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; int N; int dsu[1005]; int sz[1005]; int find(int u){ if(dsu[u] == u)return u; return dsu[u] = find(dsu[u]); } void merge(int u, int v){ u = find(u); v = find(v); if(u == v)return; if(sz[u] < sz[v])swap(u,v); dsu[v] = u; sz[u] += sz[v]; } int construct(vector<vector<int>> p){ N = p.size(); assert(N <= 1000); bool c0 = false; bool c1 = false; bool c2 = false; bool c3 = false; for(int i = 0; i < N; i++){ for(int j = 0;j < N; j++){ if(p[i][j] == 0)c0 = true; if(p[i][j] == 1)c1 = true; if(p[i][j] == 2)c2 = true; if(p[i][j] == 3)c3 = true; } } if(!c0 && c1 && !c2 && !c3){ //tree case vector<vector<int>> b; for(int i = 0; i < N;i ++){ int c1 = 2*i + 1; int c2 = 2*i + 2; int p = (i-1)/2; if(i == 0)p =-1; vector<int> curr; for(int j = 0;j < N; j++){ if(j == p || j == c1 || j== c2){ curr.pb(1); } else{ curr.pb(0); } } b.pb(curr); } build(b); return 1; } else{ //subtask 2/3 //do dsu for(int i = 0;i < N; i++){ dsu[i] = i; sz[i] = 1; } for(int i = 0; i < N;i ++){ for(int j = 0;j < N; j++){ if(p[i][j] == 0){ if(find(i) == find(j)){ //not possible //assert(false); return 0; } } else{ merge(i, j); } } } for(int i = 0; i < N;i ++){ assert(find(i) < N && find(i) >= 0); int g = 0; for(int j = 0;j < N;j ++){ g = max(g, p[i][j]); } if(sz[find(i)] <= g && sz[find(i)] != 1)return 0; } //subtask 2 //make a line vector<vector<int>> edges(N); for(int i = 0; i < N;i ++){ edges[i].resize(N); } int prev[N]; int f[N]; memset(f, -1, sizeof(f)); memset(prev, -1, sizeof(prev)); for(int i = 0; i < N;i ++){ int cmp = find(i); if(prev[cmp] != -1){ edges[prev[cmp]][i] = 1; edges[i][prev[cmp]] = 1; } if(f[cmp] == -1){ f[cmp] = i; } prev[cmp] = i; } if(c2){ for(int i = 0; i < N;i ++){ edges[prev[i]][f[i]] = 1; edges[f[i]][prev[i]] = 1; } } build(edges); return 1; } return 0; }
#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...