Submission #301422

#TimeUsernameProblemLanguageResultExecution timeMemory
301422cuom1999Connecting Supertrees (IOI20_supertrees)C++14
56 / 100
261 ms30200 KiB
#include <bits/stdc++.h> #include "supertrees.h" using namespace std; struct Solver { int n; vector<bool> vs; vector<int> lineIndex, cycleIndex; vector<vector<int>> p, line, cycle; Solver(vector<vector<int>> p): p(p), n(p.size()) { vs.resize(n); lineIndex.resize(n); line.resize(n); cycle.resize(n); cycleIndex.resize(n); } void dfs1(int a, int c) { if (vs[a]) return; vs[a] = 1; lineIndex[a] = c; line[c].push_back(a); for (int i = 0; i < n; i++) { if (p[a][i] == 1) dfs1(i, c); } } void dfs2(int a, int c) { if (vs[a]) return; vs[a] = 1; cycle[c].push_back(a); cycleIndex[a] = c; for (int i = 0; i < n; i++) { if (p[a][i] == 2) dfs2(i, c); } } int solve() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (p[i][j] == 3) return 0; } } for (int i = 0; i < n; i++) { if (!vs[i]) dfs1(i, i); } for (int i = 0; i < n; i++) { if (lineIndex[i] == i) vs[i] = 0; } for (int i = 0; i < n; i++) { if (!vs[i]) dfs2(i, i); } // construct res vector<vector<int>> res(n, vector<int>(n)); for (int i = 0; i < n; i++) { for (int j = 0; j + 1 < line[i].size(); j++) { int x = line[i][j], y = line[i][j + 1]; res[x][y] = res[y][x] = 1; } if (cycle[i].size() > 1) cycle[i].push_back(cycle[i][0]); for (int j = 0; j + 1 < cycle[i].size(); j++) { int x = cycle[i][j], y = cycle[i][j + 1]; res[x][y] = res[y][x] = 1; } } // check satisfaction // p[i][j] = 0, p[j][k] = 0, p[i][k] > 0 // p[i][j] = 1 iff lineIndex[i] = lineIndex[j] for (int i = 0; i < n; i++) { if (cycle[i].size() == 2) return 0; for (int j = 0; j < n; j++) { int a = cycleIndex[lineIndex[i]]; int b = cycleIndex[lineIndex[j]]; if (p[i][j] == 0 && a == b) { return 0; } if (p[i][j] && a != b) { return 0; } if (p[i][j] == 1 && lineIndex[i] != lineIndex[j]) { return 0; } if (p[i][j] == 2 && lineIndex[i] == lineIndex[j]) { return 0; } } } build(res); return 1; } }; int construct(vector<vector<int>> p) { return Solver(p).solve(); }

Compilation message (stderr)

supertrees.cpp: In constructor 'Solver::Solver(std::vector<std::vector<int> >)':
supertrees.cpp:9:25: warning: 'Solver::p' will be initialized after [-Wreorder]
    9 |     vector<vector<int>> p, line, cycle;
      |                         ^
supertrees.cpp:6:9: warning:   'int Solver::n' [-Wreorder]
    6 |     int n;
      |         ^
supertrees.cpp:11:5: warning:   when initialized here [-Wreorder]
   11 |     Solver(vector<vector<int>> p): p(p), n(p.size()) {
      |     ^~~~~~
supertrees.cpp: In member function 'int Solver::solve()':
supertrees.cpp:63:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |             for (int j = 0; j + 1 < line[i].size(); j++) {
      |                             ~~~~~~^~~~~~~~~~~~~~~~
supertrees.cpp:69:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |             for (int j = 0; j + 1 < cycle[i].size(); j++) {
      |                             ~~~~~~^~~~~~~~~~~~~~~~~
#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...