제출 #1238736

#제출 시각아이디문제언어결과실행 시간메모리
1238736matsakyannn가장 긴 여행 (IOI23_longesttrip)C++20
15 / 100
5 ms416 KiB
#include <bits/stdc++.h> #include "longesttrip.h" using namespace std; #ifndef ONLINE_JUDGE #define dbg(x) cerr << #x << ' '; print(x); cerr << endl; #else #define dbg(x) #endif void print(int x) {cerr << x;} void print(long long x) {cerr << x;} void print(char x) {cerr << x;} void print(string x) {cerr << x;} void print(double x) {cerr << x;} template <class T> void print(vector <T> x); template <class T> void print(set <T> x); template <class T> void print(multiset <T> x); template <class T, class V> void print(pair <T, V> x); template <class T, class V> void print(map <T, V> x); template <class T> void print(vector <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";} template <class T> void print(set <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";} template <class T> void print(multiset <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";} template <class T, class V> void print(pair <T, V> x) {cerr << "{"; print(x.first); cerr << ' '; print(x.second); cerr << "}";} template <class T, class V> void print(map <T, V> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";} #define ll long long #define pb push_back #define ppb pop_back #define PII pair <int, int> #define PLL pair <ll, ll> #define all(v) (v).begin(), (v).end() #define OK cerr << "OK\n"; #define MP make_pair vector <int> operator+(vector <int> x, vector <int> y){ for(int i : y) x.pb(i); return x; } bool check(vector <int> x, vector <int> y){ set <int> st; for(int i : x) st.insert(i); for(int i : y) st.insert(i); return st.size() == x.size() + y.size(); } vector <int> longest_trip(int N, int D){ vector <int> a, b; a.pb(0); b.pb(1); for(int i = 2; i < N; i++){ if(are_connected({a.back()}, {i})){ a.pb(i); continue; } if(are_connected({b.back()}, {i})){ b.pb(i); continue; } reverse(all(b)); a = a + b; b.clear(); b.pb(i); } int lenA = a.size(), lenB = b.size(); if(!are_connected(a, b)){ if(lenA > lenB) return a; else return b; } assert(check({a.back()}, {b.back()})); if(are_connected({a.back()}, {b.back()})){ reverse(all(b)); a = a + b; return a; } assert(check({a.back()}, {b.front()})); if(are_connected({a.back()}, {b.front()})){ a = a + b; return a; } assert(check({a.front()}, {b.back()})); if(are_connected({a.front()}, {b.back()})){ b = b + a; return b; } assert(check({a.front()}, {b.front()})); if(are_connected({a.front()}, {b.front()})){ reverse(all(a)); a = a + b; return a; } vector <int> A, B; int bottom = 0, top = lenA, resA, resB; B = b; while(bottom <= top){ int mid = (top + bottom) / 2; A.clear(); for(int i = bottom; i <= mid; i++){ A.pb(i); } if(are_connected(A, B)){ resA = mid; top = mid - 1; } else{ bottom = mid + 1; } } bottom = 0, top = lenB; while(bottom <= top){ int mid = (top + bottom) / 2; B.clear(); for(int i = bottom; i <= mid; i++){ B.pb(i); } if(are_connected({resA}, B)){ resB = mid; top = mid - 1; } else{ bottom = mid + 1; } } A.clear(), B.clear(); for(int i = resA - 1; i >= 0; i--) A.pb(a[i]); for(int i = lenA - 1; i >= resA; i--) A.pb(a[i]); for(int i = resB; i < lenB; i++) B.pb(b[i]); for(int i = 0; i < resB; i++) B.pb(b[i]); A = A + b; return A; }
#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...