Submission #1066656

#TimeUsernameProblemLanguageResultExecution timeMemory
1066656becaidoLongest Trip (IOI23_longesttrip)C++17
100 / 100
14 ms600 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,popcnt,sse4,abm") #include <bits/stdc++.h> using namespace std; #ifndef WAIMAI #include "longesttrip.h" #else #include "grader.cpp" #endif #ifdef WAIMAI #define debug(HEHE...) cout << "[" << #HEHE << "] : ", dout(HEHE) void dout() {cout << '\n';} template<typename T, typename...U> void dout(T t, U...u) {cout << t << (sizeof...(u) ? ", " : ""), dout(u...);} #else #define debug(...) 7122 #endif #define ll long long #define Waimai ios::sync_with_stdio(false), cin.tie(0) #define FOR(x,a,b) for (int x = a, I = b; x <= I; x++) #define pb emplace_back #define F first #define S second bool is(int x, int y) { return are_connected({x}, {y}); } vector<int> longest_trip(int n, int D) { vector<int> A, B; A.pb(0), B.pb(1); FOR (i, 2, n - 1) { if (i == n - 1) { if (is(A.back(), i)) { A.pb(i); continue; } if (is(B.back(), i)) { B.pb(i); continue; } reverse(B.begin(), B.end()); A.insert(A.end(), B.begin(), B.end()); B.clear(); B.pb(i); continue; } bool ax = is(A.back(), i); bool xy = is(i, i + 1); if (ax && xy) { A.pb(i); A.pb(i + 1); } else if (ax) { bool by = is(B.back(), i + 1); if (by) { A.pb(i); B.pb(i + 1); } else { A.pb(i); reverse(B.begin(), B.end()); A.insert(A.end(), B.begin(), B.end()); B.clear(); B.pb(i + 1); } } else if (xy) { bool bx = is(B.back(), i); if (bx) { B.pb(i); B.pb(i + 1); } else { reverse(B.begin(), B.end()); A.insert(A.end(), B.begin(), B.end()); B.clear(); B.pb(i); B.pb(i + 1); } } else { bool by = is(B.back(), i + 1); if (by) { A.pb(i + 1); reverse(B.begin(), B.end()); A.insert(A.end(), B.begin(), B.end()); B.clear(); B.pb(i); } else { A.pb(i + 1); B.pb(i); } } i++; } if (is(A[0], B[0])) { reverse(A.begin(), A.end()); A.insert(A.end(), B.begin(), B.end()); return A; } if (is(A[0], B.back())) { B.insert(B.end(), A.begin(), A.end()); return B; } if (is(A.back(), B[0])) { A.insert(A.end(), B.begin(), B.end()); return A; } if (is(A.back(), B.back())) { reverse(B.begin(), B.end()); A.insert(A.end(), B.begin(), B.end()); return A; } if (are_connected(A, B) == 0) return A.size() > B.size() ? A : B; int i = -1, j = -1; { int l = 0, r = A.size() - 1; while (l < r) { int mid = (l + r) / 2; vector<int> Al(A.begin() + l, A.begin() + mid + 1); if (are_connected(Al, B)) r = mid; else l = mid + 1; } i = l; } { int l = 0, r = B.size() - 1; while (l < r) { int mid = (l + r) / 2; vector<int> Bl(B.begin() + l, B.begin() + mid + 1); if (are_connected({A[i]}, Bl)) r = mid; else l = mid + 1; } j = l; } vector<int> ans; FOR (k, i + 1, A.size() - 1) ans.pb(A[k]); FOR (k, 0, i) ans.pb(A[k]); FOR (k, j, B.size() - 1) ans.pb(B[k]); FOR (k, 0, j - 1) ans.pb(B[k]); return ans; } /* in1 2 5 1 1 1 1 0 0 1 0 0 0 1 4 1 1 0 0 0 0 1 out1 5 1 0 2 3 4 4 2 0 1 3 4 in2 out2 */
#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...