Submission #911022

#TimeUsernameProblemLanguageResultExecution timeMemory
911022marvinthangLongest Trip (IOI23_longesttrip)C++17
85 / 100
11 ms860 KiB
/************************************* * author: marvinthang * * created: 18.01.2024 16:42:53 * *************************************/ #include "longesttrip.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define left ___left #define right ___right #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x) >> (i) & 1) #define __builtin_popcount __builtin_popcountll #define ALL(v) (v).begin(), (v).end() #define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i) #define REPD(i, n) for (int i = (n); i-- > 0; ) #define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define FORD(i, b, a) for (int i = (b), _a = (a); --i >= _a; ) #define FORE(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define FORDE(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define scan_op(...) istream & operator >> (istream &in, __VA_ARGS__ &u) #define print_op(...) ostream & operator << (ostream &out, const __VA_ARGS__ &u) #ifdef LOCAL #include "debug.h" #else #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define DB(...) 23 #define db(...) 23 #define debug(...) 23 #endif template <class U, class V> scan_op(pair <U, V>) { return in >> u.first >> u.second; } template <class T> scan_op(vector <T>) { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; } template <class U, class V> print_op(pair <U, V>) { return out << '(' << u.first << ", " << u.second << ')'; } template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")"; else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); } template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); } template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; } vector<int> longest_trip(int N, int D) { auto connected_landmark = [&] (int u, int v) { return are_connected(vector{u}, vector{v}); }; vector <int> path; if (D == 3) { path.resize(N); iota(ALL(path), 0); } else if (D == 2) { if (!connected_landmark(0, 1)) path = vector{0, 2, 1}; else if (!connected_landmark(0, 2)) path = vector{0, 1, 2}; else path = vector{1, 0, 2}; FOR(i, 3, N) { if (!connected_landmark(i, path.back())) path.insert(path.begin(), i); else path.push_back(i); } } else { vector <int> left{0}, right{1}; FOR(i, 2, N) { if (connected_landmark(left.back(), i)) left.push_back(i); else if (connected_landmark(right.back(), i)) right.push_back(i); else { left.insert(left.end(), right.rbegin(), right.rend()); right = vector{i}; } } if (left.size() < right.size()) swap(left, right); if (right.empty() || !are_connected(left, right)) return left; REP(t, 2) { if ((int) left.size() > 1) { if (connected_landmark(left.back(), right.back())) { left.insert(left.end(), right.rbegin(), right.rend()); return left; } else if (connected_landmark(left[0], right.back())) { right.insert(right.end(), ALL(left)); return right; } assert(connected_landmark(left[0], left.back())); } swap(left, right); } int l = 1, r = (int) left.size() - 1; while (l <= r) { int m = l + r >> 1; if (are_connected(vector(left.begin(), left.begin() + m), right)) r = m - 1; else l = m + 1; } rotate(left.begin(), left.begin() + l, left.end()); l = 0, r = (int) right.size() - 2; while (l <= r) { int m = l + r >> 1; if (are_connected(vector(right.begin(), right.begin() + m + 1), {left.back()})) r = m - 1; else l = m + 1; } rotate(right.begin(), right.begin() + l, right.end()); left.insert(left.end(), ALL(right)); return left; } return path; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:86:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   86 |             int m = l + r >> 1;
      |                     ~~^~~
longesttrip.cpp:93:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   93 |             int m = l + r >> 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...