Submission #839948

#TimeUsernameProblemLanguageResultExecution timeMemory
839948emeraldblockLongest Trip (IOI23_longesttrip)C++17
85 / 100
21 ms336 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(123532); 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}); for (int i = 2; i < N; ++i) { if (check({s1.back()}, {i})) { s1.push_back(i); } else if (check({s2.back()}, {i})) { s2.push_back(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...