Submission #303375

#TimeUsernameProblemLanguageResultExecution timeMemory
303375VimmerConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
282 ms26288 KiB
#include <bits/stdc++.h> #include "supertrees.h" //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #define N 1005 #define PB push_back #define sz(x) int(x.size()) #define P 31 #define F first #define M ll(1e9 + 7) #define S second #define all(x) x.begin(), x.end() #define endl '\n' //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("-O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("fast-math") //#pragma GCC optimize("no-stack-protector") using namespace std; //using namespace __gnu_pbds; typedef long long ll; //typedef tree<int, null_type, less_equal <int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; ll mlt(ll a, ll b) {return (a * b) % M;} ll sm(ll a, ll b) {return (a + b) % M;} int rk[N], pr[N], cnt[N][N], n, glob; bool mk[N]; vector <int> g[N]; void make(int x) {pr[x] = x; rk[x] = 1;} int fnd(int x) {if (pr[x] != x) pr[x] = fnd(pr[x]); return pr[x];} void link(int a, int b) { if (rk[b] > rk[a]) swap(a, b); rk[a] += rk[b]; pr[b] = a; } //void build(vector <vector <int> > pr) //{ // for (int i = 0; i < sz(pr); i++) // { // cout << i << ": "; // // for (auto itr : pr[i]) cout << itr << " "; cout << endl; // } //} void dfs(int v, int p) { mk[v] = 1; cnt[glob][v]++; for (auto it : g[v]) if (!mk[it]) dfs(it, v); mk[v] = 0; } int construct(vector<vector<int> > p) { n = sz(p); vector<vector<int> > answer; answer.clear(); bool f = 1, fr = 1, ft = 1; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j) {if (p[i][j] == 2 || p[i][j] == 3) fr = 0; if (p[i][j] != 1) f = 0; if (p[i][j] == 1 || p[i][j] == 3) ft = 0;} if (f) { answer.resize(n); for (int i = 0; i < n; i++) answer[i].resize(n, 0); for (int i = 1; i < n; i++) answer[0][i] = 1; for (int i = 1; i < n; i++) answer[i][0] = 1; build(answer); return 1; } if (fr) { bool good = 1; answer.resize(n); for (int i = 0; i < n; i++) answer[i].resize(n, 0); for (int i = 0; i < n; i++) make(i); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (p[i][j] == 1) { int a = fnd(i), b = fnd(j); if (a != b) {answer[i][j] = answer[j][i] = 1; link(a, b);} } for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if ((p[i][j] == 1 && fnd(i) != fnd(j)) || (p[i][j] == 0 && fnd(i) == fnd(j))) good = 0; if (good) build(answer); return good; } if (ft) { bool good = 1; answer.resize(n); for (int i = 0; i < n; i++) answer[i].resize(n, 0); for (int i = 0; i < n; i++) make(i); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (p[i][j] == 2) { int a = fnd(i), b = fnd(j); if (a != b) link(a, b); } for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j && ((p[i][j] == 2 && fnd(i) != fnd(j)) || (p[i][j] == 0 && fnd(i) == fnd(j)))) good = 0; if (!good) return 0; set <int> se; se.clear(); for (int i = 0; i < n; i++) { int id = fnd(i); if (se.find(id) != se.end()) continue; se.insert(id); vector <int> pr; pr.clear(); for (int j = 0; j < n; j++) if (fnd(j) == id) pr.PB(j); if (sz(pr) == 1) continue; if (sz(pr) == 2) {good = 0; break;} for (int j = 0; j < sz(pr); j++) { int nxt = (j + 1) % sz(pr); answer[pr[j]][pr[nxt]] = answer[pr[nxt]][pr[j]] = 1; } } if (!good) return 0; build(answer); return 1; } bool good = 1; answer.resize(n); for (int i = 0; i < n; i++) answer[i].resize(n, 0); for (int i = 0; i < n; i++) make(i); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (p[i][j] == 1 || p[i][j] == 2) { int a = fnd(i), b = fnd(j); if (a != b) link(a, b); } for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if ((p[i][j] == 1 && fnd(i) != fnd(j)) || (p[i][j] == 0 && fnd(i) == fnd(j))) good = 0; if (!good) return 0; bool mk[n], mkr[n]; for (int i = 0; i < n; i++) { mk[i] = 1; mkr[i] = 1; for (int j = 0; j < n; j++) if (i != j && p[i][j] == 1) mk[i] = 0; for (int j = 0; j < n; j++) if (i != j && p[i][j] == 2) mkr[i] = 0; } set <int> se, str; se.clear(); str.clear(); for (int i = 0; i < n; i++) { int id = fnd(i); if (se.find(id) != se.end()) continue; se.insert(id); vector <int> c; c.clear(); vector <int> pr; pr.clear(); bool bd = 1; for (int j = 0; j < n; j++) { if (fnd(j) != fnd(i)) continue; if (mk[j]) c.PB(j); else pr.PB(j); if (!mkr[j]) bd = 0; } if (sz(c) == 0) { if (bd) { for (int j = 1; j < sz(pr); j++) { int nxt = pr[j - 1]; answer[pr[j]][nxt] = answer[nxt][pr[j]] = 1; } continue; } int l = -1, r = -1; for (int j = 0; j < sz(pr); j++) { auto it = pr[j]; if (str.find(it) != str.end()) continue; str.insert(it); if (r != -1) answer[r][it] = answer[it][r] = 1; else l = it; r = it; int lst = it; for (int u = j + 1; u < sz(pr); u++) if (p[pr[u]][it] == 1) { str.insert(pr[u]); answer[pr[u]][lst] = answer[lst][pr[u]] = 1; lst = pr[u]; } } answer[l][r] = answer[r][l] = 1; continue; } for (int j = 1; j < sz(c); j++) answer[c[j]][c[j - 1]] = answer[c[j - 1]][c[j]] = 1; int l = c[0], r = c.back(); for (int j = 0; j < sz(pr); j++) { auto it = pr[j]; if (str.find(it) != str.end()) continue; str.insert(it); answer[l][it] = answer[it][l] = 1; l = it; int lst = it; for (int u = j + 1; u < sz(pr); u++) if (p[pr[u]][it] == 1) { str.insert(pr[u]); answer[pr[u]][lst] = answer[lst][pr[u]] = 1; lst = pr[u]; } } answer[l][r] = answer[r][l] = 1; } for (int i = 0; i < n; i++) answer[i][i] = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (answer[i][j] == 1) g[i].PB(j); for (int i = 0; i < n; i++) { glob = i; dfs(i, -1); for (int j = 0; j < n; j++) if (cnt[i][j] != p[i][j]) return 0; } build(answer); return 1; } //int main() //{ //// freopen("help.in", "r", stdin); freopen("help.out", "w", stdout); // // ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0); // // vector <vector <int> > vr(6); // // for (int i = 0; i < 6; i++) {vr[i].resize(6, 0); vr[i][i] = 1;} // // vr[0][3] = vr[3][0] = vr[2][4] = vr[4][2] = vr[1][5] = vr[5][1] = 1; // // for (int i = 0; i < 6; i++) // for (int j = 0; j < 6; j++) // if (vr[i][j] != 1) vr[i][j] = 2; // // cout << construct(vr) << endl; //}
#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...