Submission #1042881

#TimeUsernameProblemLanguageResultExecution timeMemory
1042881kwongwengLongest Trip (IOI23_longesttrip)C++17
60 / 100
282 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef long double ld; typedef vector<vector<ll>> vll; #define FOR(i, a, b) for(int i = a; i < b; i++) #define ROF(i, a, b) for(int i = a; i >= b; i--) #define pb push_back #define ms memset #define fi first #define se second vi longest_trip(int N, int D) { vector<vi> CC; FOR(i,0,N) CC.pb({i}); while (CC.size() > 2){ int sz = CC.size(), s0 = CC[0].size(), s1 = CC[1].size(), sn = CC[sz-1].size(); if (are_connected({CC[sz-1][0]}, {CC[0][s0-1]})){ FOR(i,0,sn){ CC[0].pb(CC[sz-1][i]); } CC.pop_back(); continue; } if (are_connected({CC[sz-1][0]}, {CC[1][s1-1]})){ FOR(i,0,sn){ CC[1].pb(CC[sz-1][i]); } CC.pop_back(); continue; } ROF(i,s1-1,0){ CC[0].pb(CC[1][i]); } FOR(i,1,sz-1){ CC[i]=CC[i+1]; } CC.pop_back(); } int s0 = CC[0].size(), s1 = CC[1].size(); if (are_connected(CC[0], CC[1])){ if (are_connected({CC[0][0]}, {CC[1][0]})){ reverse(CC[0].begin(), CC[0].end()); FOR(i,0,s1) CC[0].pb(CC[1][i]); return CC[0]; } if (are_connected({CC[0][0]}, {CC[1][s1-1]})){ reverse(CC[0].begin(), CC[0].end()); reverse(CC[1].begin(), CC[1].end()); FOR(i,0,s1) CC[0].pb(CC[1][i]); return CC[0]; } if (are_connected({CC[0][s0-1]}, {CC[1][0]})){ FOR(i,0,s1) CC[0].pb(CC[1][i]); return CC[0]; } if (are_connected({CC[0][s0-1]}, {CC[1][s1-1]})){ reverse(CC[1].begin(), CC[1].end()); FOR(i,0,s1) CC[0].pb(CC[1][i]); return CC[0]; } FOR(i,0,s0){ FOR(j,0,s1){ if (are_connected({CC[0][i]},{CC[1][j]})){ vi ans; FOR(k,i+1,i+s0+1) ans.pb(CC[0][k%s0]); FOR(k,j,j+s1) ans.pb(CC[1][k%s1]); return ans; } } } int l = 0, r = s0; while (r-l>1){ int mid = (l+r)/2; vi A; FOR(i,0,mid) A.pb(CC[0][i]); if (are_connected(A, CC[1])){ r = mid; }else{ l = mid; } } int a = r; l=0; r=s1; while (r-l>1){ int mid = (l+r)/2; vi A; FOR(i,0,mid) A.pb(CC[1][i]); if (are_connected({a}, A)){ r=mid; }else{ l=mid; } } vi ans; FOR(i,a+1,a+s0+1) ans.pb(CC[0][i%s0]); FOR(i,r,r+s1) ans.pb(CC[1][i%s1]); return ans; } if (CC[0].size()>CC[1].size()) return CC[0]; return CC[1]; }
#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...