Submission #1001346

#TimeUsernameProblemLanguageResultExecution timeMemory
1001346spacewalkerLongest Trip (IOI23_longesttrip)C++17
100 / 100
12 ms612 KiB
#include <bits/stdc++.h> #include "longesttrip.h" using namespace std; optional<int> find_edge_between(vector<int> s, int v) { if (!are_connected(s, {v})) return nullopt; vector<int> current = s; while (current.size() > 1) { int hs = current.size() / 2; vector<int> h1(begin(current), begin(current) + hs), h2(begin(current) + hs, end(current)); if (are_connected(h1, {v})) current = h1; else current = h2; } return current[0]; } optional<pair<int, int>> find_edge_between(vector<int> s1, vector<int> s2) { if (!are_connected(s1, s2)) return nullopt; vector<int> current = s1; while (current.size() > 1) { int hs = current.size() / 2; vector<int> h1(begin(current), begin(current) + hs), h2(begin(current) + hs, end(current)); if (are_connected(h1, s2)) current = h1; else current = h2; } return make_pair(current[0], find_edge_between(s2, current[0]).value()); } std::vector<int> longest_trip(int N, int D) { deque<int> p1{0}, p2; bool sure_ps_are_dced = true; for (int i = 1; i < N; ++i) { if (are_connected({p1.back()}, {i})) { p1.push_back(i); if (!p2.empty()) sure_ps_are_dced = false; } else if (p2.empty()) { p2.push_front(i); sure_ps_are_dced = true; } else { bool ps_are_dced = sure_ps_are_dced || !are_connected({p1.back()}, {p2.front()}); if (ps_are_dced) { p2.push_front(i); sure_ps_are_dced = true; } else { p1.insert(end(p1), begin(p2), end(p2)); p2.clear(); --i; // we will have to process this again } } /* cerr << "adding " << i << endl; for (int v : p1) cerr << v << " "; cerr << (sure_ps_are_dced ? " X " : " ? "); for (int v : p2) cerr << v << " "; cerr << endl; */ } if (!sure_ps_are_dced && !p2.empty() && are_connected({p1.back()}, {p2.front()})) { p1.insert(end(p1), begin(p2), end(p2)); return vector(begin(p1), end(p1)); } vector<int> fp1(p1.begin(), p1.end()), fp2(p2.begin(), p2.end()); if (fp1.size() == N) return fp1; if (fp2.size() > 1 && !are_connected({fp2.front()}, {fp2.back()})) { vector<int> ans = fp1; reverse(begin(fp2), end(fp2)); ans.insert(end(ans), begin(fp2), end(fp2)); return ans; } if (fp1.size() > 1 && !are_connected({fp1.front()}, {fp1.back()})) { reverse(begin(fp2), end(fp2)); vector<int> ans = fp2; ans.insert(end(ans), begin(fp1), end(fp1)); return ans; } auto bridge = find_edge_between(fp1, fp2); if (!bridge) { return fp1.size() > fp2.size() ? fp1 : fp2; } auto left_end_iter = find(begin(fp2), end(fp2), bridge->second); rotate(begin(fp2), left_end_iter, end(fp2)); auto right_end_iter = find(begin(fp1), end(fp1), bridge->first); rotate(begin(fp1), right_end_iter, end(fp1)); vector<int> ans = fp2; reverse(begin(ans), end(ans)); ans.insert(end(ans), begin(fp1), end(fp1)); return ans; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:64:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   64 |   if (fp1.size() == N) return fp1;
      |       ~~~~~~~~~~~^~~~
#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...