Submission #840761

#TimeUsernameProblemLanguageResultExecution timeMemory
840761emeraldblockLongest Trip (IOI23_longesttrip)C++17
100 / 100
18 ms428 KiB
#include <bits/stdc++.h> #include <random> #include "longesttrip.h" using namespace std; vector<int> pi,ip; bool check(vector<int> a, vector<int> b) { for (auto& x : a) x = pi[x]; for (auto& x : b) x = pi[x]; return are_connected(a,b); } vector<int> isline(vector<int> a) { for (auto& x : a) x = pi[x]; #ifdef LOCAL for (int i = 1; i < a.size(); ++i) { assert(are_connected({a[i-1]}, {a[i]})); } #endif return a; } mt19937 mt(361); std::vector<int> longest_trip(int N, int D) { pi.resize(N); iota(pi.begin(),pi.end(),0); shuffle(pi.begin(),pi.end(),mt); vector<int> s1({0}),s2({1}); bool sep = false; for (int i = 2; i < N; ++i) { if (check({s1.back()}, {i})) { s1.push_back(i); sep = false; } else if (sep || check({s2.back()}, {i})) { s2.push_back(i); sep = true; } else { if (false && i < N-1) { if (check({i},{i+1})) { while (!s2.empty()) { s1.push_back(s2.back()); s2.pop_back(); } s2.push_back(i); s2.push_back(i+1); } else { s1.push_back(i+1); while (!s2.empty()) { s1.push_back(s2.back()); s2.pop_back(); } s2.push_back(i); } ++i; } else { while (!s2.empty()) { s1.push_back(s2.back()); s2.pop_back(); } s2.push_back(i); } } } // for (auto x : s1) cerr << x << " "; // cerr << "\n"; // for (auto x : s2) cerr << x << " "; // cerr << "\n"; if (!check(s1, s2)) { return isline(s1.size() >= s2.size() ? s1 : s2); } if (check(s1,{s2.front()})) { reverse(s2.begin(),s2.end()); } else { int lo = 0, hi = s2.size(); while (hi-lo>1) { int mid = (lo+hi)/2; vector<int> v; for (int i = mid; i < hi; ++i) { v.push_back(s2[i]); } if (!check(s1, v)) { hi = mid; } else { lo = mid; } } rotate(s2.begin(),s2.begin()+hi,s2.end()); } if (check({s1.front()},{s2.back()})) { reverse(s1.begin(),s1.end()); } else { int lo = 0, hi = s1.size(); while (hi-lo>1) { int mid = (lo+hi)/2; vector<int> v; for (int i = mid; i < hi; ++i) { v.push_back(s1[i]); } if (!check(v, {s2.back()})) { hi = mid; } else { lo = mid; } } rotate(s1.begin(),s1.begin()+hi,s1.end()); } // for (auto x : s1) cerr << x << " "; // cerr << "\n"; // for (auto x : s2) cerr << x << " "; // cerr << "\n"; while (!s2.empty()) { s1.push_back(s2.back()); s2.pop_back(); } return isline(s1); }
#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...