Submission #841801

#TimeUsernameProblemLanguageResultExecution timeMemory
841801emuyumiLongest Trip (IOI23_longesttrip)C++17
15 / 100
12 ms856 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> longest_trip(int N, int D) { // check if single component // if not, each component is clique, problem is then find largest component // otherwise, one component, // start with one node and keep trying to extend path by randomly querying // if gets stuck, that means past must be a clique, done int calls = 0; auto my_are_connected = [&](vector<int> a, vector<int> b) { calls ++; assert(calls <= 32460); return are_connected(a, b); }; bool found = 0; vector<int> answer; using vi = vector<int>; auto halves = [&](vector<int> v) -> pair<vi, vi> { int m = v.size() / 2; return {{v.begin(), v.begin()+m}, {v.begin()+m, v.end()}}; }; auto locate = [&](vector<int> src, vector<int> dest) -> int { while (src.size() != 1) { auto [a, b] = halves(src); if (my_are_connected(a, dest)) src = a; else src = b; } return src[0]; }; vector<int> path = {0}; vector<int> left(N-1); vector<int> clique; iota(left.begin(), left.end(), 1); while (left.size()) { random_shuffle(left.begin(), left.end()); int v = path.back(); if (!clique.empty()) { if (my_are_connected(clique, {v})) { int b = locate(clique, {v}); clique.erase(find(clique.begin(), clique.end(), b)); path.push_back(b); for (int x : clique) path.push_back(x); clique.clear(); continue; } } while (!left.empty()) { int nxt = left.back(); left.pop_back(); if (!my_are_connected({nxt}, {v})) { clique.push_back(nxt); } else { path.push_back(nxt); break; } } } if (!clique.empty()) { clique = clique; if (!my_are_connected(path, clique)) { if (path.size() > clique.size()) return path; else return clique; } int a = locate(path, clique); int b = locate(clique, {a}); vector<int> ans = clique; ans.erase(find(ans.begin(), ans.end(), b)); ans.push_back(b); int j = find(path.begin(), path.end(), a) - path.begin(); if (j == 0) { for (int x : path) { ans.push_back(x); } } else { for (int i = j; i >= 0; --i) { ans.push_back(path[i]); } for (int i = path.size()-1; i > j; --i) { ans.push_back(path[i]); } } // for (int i = 1; i < ans.size(); ++i) { // assert(my_are_connected({ans[i]}, {ans[i-1]})); // } return ans; } for (int i = 1; i < path.size(); ++i) { assert(my_are_connected({path[i]}, {path[i-1]})); } return path; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:100:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |  for (int i = 1; i < path.size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
longesttrip.cpp:23:7: warning: unused variable 'found' [-Wunused-variable]
   23 |  bool found = 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...