Submission #300357

#TimeUsernameProblemLanguageResultExecution timeMemory
300357oolimryConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
272 ms26232 KiB
#include "supertrees.h" #include <bits/stdc++.h> #define all(x) (x).begin() (x).end() #define sz(x) (int) (x).size() using namespace std; typedef vector<vector<int>> vvi; int n; vector<vector<int>> die = {{-1}}; struct ufds{ int p[1005]; int n; void init(int N ){ n = N; for(int i = 0;i <= n;i++) p[i] = i; } int findSet(int u){ if(u == p[u]) return u; else{ p[u] = findSet(p[u]); return p[u]; } } void unionSet(int u, int v){ u = findSet(u); v = findSet(v); if(u == v) return; if(u&v) swap(u,v); p[u] = v; } bool isSameSet(int u, int v){ return findSet(u) == findSet(v); } }; vector<vector<int>> adj; vector<vector<int>> decomp1(){ int good = 1, bad = 0; ufds uf; uf.init(n); for(int i = 0;i < n;i++) for(int j = 0;j < n;j++){ if(adj[i][j] >= good) uf.unionSet(i, j); } for(int i = 0;i < n;i++) for(int j = 0;j < n;j++){ if(adj[i][j] >= good){ if(!uf.isSameSet(i,j)) return die; } else if(adj[i][j] <= bad){ if(uf.isSameSet(i,j)) return die; } } map<int,vector<int> > M; for(int i = 0;i < n;i++){ int u = uf.findSet(i); M[u].push_back(i); } vvi res; for(auto x : M){ res.push_back({}); for(int y : x.second) res.back().push_back(y); } return res; } ufds uf2; vvi decomp2(vector<int> A){ int good = 1, bad = 2; for(int i : A) for(int j : A){ if(adj[i][j] == 1) uf2.unionSet(i, j); } for(int i : A) for(int j : A){ if(adj[i][j] == 1){ if(!uf2.isSameSet(i,j)) return die; } else if(adj[i][j] == 2){ if(uf2.isSameSet(i,j)) return die; } } map<int,vector<int> > M; for(int i : A){ int u = uf2.findSet(i); M[u].push_back(i); } vvi res; for(auto x : M){ res.push_back({}); for(int y : x.second) res.back().push_back(y); } return res; } int construct(vector<vector<int>> ADJ) { adj = ADJ; n = adj.size(); vector<vector<int> > answer; for (int i = 0; i < n; i++) { std::vector<int> row; row.resize(n); answer.push_back(row); } for(auto x : ADJ) for(int y : x){ if(y == 3) return 0; } vvi res = decomp1(); if(res == die) return 0; uf2.init(n); for(vector<int> x : res){ vvi res2 = decomp2(x); if(sz(res2) == 2) return 0; for(auto line : res2){ for(int i = 1;i < sz(line);i++){ int a = line[i-1], b = line[i]; answer[a][b] = 1; answer[b][a] = 1; } } if(sz(res2) > 2){ for(int i = 0;i < sz(res2);i++){ int j = i+1; if(j == sz(res2)) j = 0; int a = res2[i].back(), b = res2[j].back(); answer[a][b] = 1; answer[b][a] = 1; } } //cout << "F\n\n"; } for(int i = 0;i < n;i++) answer[i][i] = 0; build(answer); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'vvi decomp2(std::vector<int>)':
supertrees.cpp:77:6: warning: unused variable 'good' [-Wunused-variable]
   77 |  int good = 1, bad = 2;
      |      ^~~~
supertrees.cpp:77:16: warning: unused variable 'bad' [-Wunused-variable]
   77 |  int good = 1, bad = 2;
      |                ^~~
#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...