제출 #1305160

#제출 시각아이디문제언어결과실행 시간메모리
1305160nathlol2가장 긴 여행 (IOI23_longesttrip)C++20
15 / 100
7 ms420 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; std::vector<int> longest_trip(int N, int D){ vector<int> ans; if(D == 3){ ans.resize(N); iota(ans.begin(), ans.end(), 0); return ans; }else if(D == 2){ int pa[N], h1 = 0, h2 = 1; for(int i = 0;i<N;i++) pa[i] = -1; if(are_connected({0}, {1})){ pa[1] = 0; for(int i = 2;i<N;i++){ if(are_connected({i}, {h1})){ pa[i] = h1; h1 = i; }else{ pa[i] = h2; h2 = i; } } int id = h1; while(id != 0){ ans.push_back(id); id = pa[id]; } ans.push_back(0); vector<int> tmp; id = h2; while(id != 0){ tmp.push_back(id); id = pa[id]; } reverse(tmp.begin(), tmp.end()); for(auto x : tmp){ ans.push_back(x); } return ans; }else{ pa[0] = 2; pa[1] = 2; for(int i = 3;i<N;i++){ if(are_connected({i}, {h1})){ pa[i] = h1; h1 = i; }else{ pa[i] = h2; h2 = i; } } int id = h1; while(id != 2){ ans.push_back(id); id = pa[id]; } ans.push_back(2); vector<int> tmp; id = h2; while(id != 2){ tmp.push_back(id); id = pa[id]; } reverse(tmp.begin(), tmp.end()); for(auto x : tmp){ ans.push_back(x); } return ans; } }else{ vector<int> adj[N]; int h1 = 0, t1 = 0, h2 = 1, t2 = 1; for(int i = 2;i<N;i++){ if(are_connected({i}, {t1})){ adj[i].push_back(t1); adj[t1].push_back(i); t1 = i; }else if(are_connected({i}, {t2})){ adj[i].push_back(t2); adj[t2].push_back(i); t2 = i; }else{ adj[t1].push_back(t2); adj[t2].push_back(t1); t1 = h2; h2 = i; t2 = i; } } vector<int> l1, l2; int id = h1, pv = -1, nxt; while(id != t1){ l1.push_back(id); for(auto v : adj[id]){ if(v != pv){ nxt = v; } } pv = id; id = nxt; } l1.push_back(t1); id = h2, pv = -1; while(id != t2){ l2.push_back(id); for(auto v : adj[id]){ if(v != pv){ nxt = v; } } pv = id; id = nxt; } l2.push_back(t2); if(are_connected(l1, l2)){ vector<int> ask1, ask2; ask1.push_back(l1[0]); if(l1.size() != 1) ask1.push_back(l1[l1.size() - 1]); ask2.push_back(l2[0]); if(l2.size() != 1) ask2.push_back(l2[l2.size() - 1]); if(are_connected(ask1, ask2)){ if(are_connected({l1[0]}, {l2[0]})){ reverse(l1.begin(), l1.end()); for(auto x : l1) ans.push_back(x); for(auto x : l2) ans.push_back(x); return ans; }else if(are_connected({l1[0]}, {l2[l2.size() - 1]})){ ans = l2; for(auto x : l1) ans.push_back(x); return ans; }else if(are_connected({l1[l1.size() - 1]}, {l2[0]})){ ans = l1; for(auto x : l2) ans.push_back(x); return ans; }else{ ans = l1; reverse(l2.begin(), l2.end()); for(auto x : l2) ans.push_back(x); return ans; } } int l = 1, r = l1.size() - 2, ans1 = -1, ans2 = -1; while(l <= r){ int md = (l + r) / 2; vector<int> tmp; for(int i = 0;i<md;i++) tmp.push_back(l1[i]); if(are_connected(tmp, l2)){ ans1 = md; r = md - 1; }else{ l = md + 1; } } l = 1, r = l2.size() - 2; while(l <= r){ int md = (l + r) / 2; vector<int> tmp; for(int i = 0;i<md;i++) tmp.push_back(l2[i]); if(are_connected({l1[ans1]}, tmp)){ ans2 = md; r = md - 1; }else{ l = md + 1; } } for(int i = ans1 + 1;i<l1.size();i++){ ans.push_back(l1[i]); } for(int i = 0;i<=ans1;i++){ ans.push_back(l1[i]); } for(int i = ans2;i<l2.size();i++){ ans.push_back(l2[i]); } for(int i = 0;i<ans2;i++){ ans.push_back(l2[i]); } return ans; }else{ if(l1.size() >= l2.size()){ return l1; }else{ return l2; } } } }
#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...