Submission #628770

#TimeUsernameProblemLanguageResultExecution timeMemory
628770dqhungdlThousands Islands (IOI22_islands)C++17
18.40 / 100
249 ms42168 KiB
#include "islands.h" #include <bits/stdc++.h> #include <variant> using namespace std; const int MAX = 1e5 + 5; typedef pair<int, int> ii; int N, mark[MAX]; vector<vector<vector<int>>> g; vector<ii> ng[MAX]; vector<int> path; bool dfs(int u) { if (mark[u] == 2) return false; if (mark[u] == 1) { path.push_back(u); return true; } mark[u] = 1; for (auto &[v, id]: ng[u]) if (dfs(v)) { path.push_back(u); return true; } mark[u] = 2; return false; } variant<bool, vector<int>> find_journey(int _N, int M, vector<int> U, vector<int> V) { N = _N; if (N == 2) { vector<int> g[2]; for (int i = 0; i < M; i++) g[U[i]].push_back(i); if (g[0].size() < 2 || g[1].empty()) return false; return vector<int>({g[0][0], g[1][0], g[0][1], g[0][0], g[1][0], g[0][1]}); } g.resize(N, vector<vector<int>>(N)); for (int i = 0; i < M; i++) g[U[i]][V[i]].push_back(i); bool isClique = true; for (int i = 0; i < N && isClique; i++) for (int j = 0; j < N && isClique; j++) if (i != j && g[i][j].empty()) isClique = false; if (isClique) return vector<int>({g[0][1][0], g[1][2][0], g[2][0][0], g[0][2][0], g[2][1][0], g[1][0][0], g[2][0][0], g[1][2][0], g[0][1][0], g[1][0][0], g[2][1][0], g[0][2][0]}); bool isDoubled = M % 2 == 0; for (int i = 1; i < M && isDoubled; i += 2) if (U[i - 1] != U[i] || V[i - 1] != V[i]) isDoubled = false; if (isDoubled) { for (int i = 1; i < M; i += 2) ng[U[i]].emplace_back(V[i], i); if (dfs(0)) { reverse(path.begin(), path.end()); int pivot = -1; for (int i = 0; i < path.size(); i++) if (path[i] == path.back()) { pivot = i; break; } vector<int> rs; for (int i = 0; i < pivot; i++) rs.push_back(g[path[i]][path[i + 1]][0]); vector<int> cycle[2]; for (int t = 0; t <= 1; t++) for (int i = pivot; i < path.size() - 1; i++) cycle[t].push_back(g[path[i]][path[i + 1]][t]); for (int step = 0; step < cycle[0].size(); step++) for (int t = 0; t <= 1; t++) for (int i = 0; i < cycle[t].size(); i++) rs.push_back(cycle[t][(i - step + cycle[t].size()) % cycle[t].size()]); for (int i = pivot - 1; i >= 0; i--) rs.push_back(g[path[i]][path[i + 1]][0]); return rs; } return false; } return false; } //int main() { // freopen("../_input", "r", stdin); // int N, M; // assert(2 == scanf("%d %d", &N, &M)); // // vector<int> U(M), V(M); // for (int i = 0; i < M; ++i) { // assert(2 == scanf("%d %d", &U[i], &V[i])); // } // // variant<bool, vector<int>> result = find_journey(N, M, U, V); // if (result.index() == 0) { // printf("0\n"); // if (get<bool>(result)) { // printf("1\n"); // } else { // printf("0\n"); // } // } else { // printf("1\n"); // vector<int> &canoes = get<vector<int>>(result); // printf("%d\n", static_cast<int>(canoes.size())); // for (int i = 0; i < static_cast<int>(canoes.size()); ++i) { // if (i > 0) { // printf(" "); // } // printf("%d", canoes[i]); // } // printf("\n"); // } // return 0; //}

Compilation message (stderr)

islands.cpp: In function 'std::variant<bool, std::vector<int, std::allocator<int> > > find_journey(int, int, std::vector<int>, std::vector<int>)':
islands.cpp:63:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |             for (int i = 0; i < path.size(); i++)
      |                             ~~^~~~~~~~~~~~~
islands.cpp:73:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |                 for (int i = pivot; i < path.size() - 1; i++)
      |                                     ~~^~~~~~~~~~~~~~~~~
islands.cpp:75:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |             for (int step = 0; step < cycle[0].size(); step++)
      |                                ~~~~~^~~~~~~~~~~~~~~~~
islands.cpp:77:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |                     for (int i = 0; i < cycle[t].size(); i++)
      |                                     ~~^~~~~~~~~~~~~~~~~
#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...