Submission #1082443

#TimeUsernameProblemLanguageResultExecution timeMemory
1082443BoasLongest Trip (IOI23_longesttrip)C++17
40 / 100
1022 ms3944 KiB
#include "longesttrip.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; template <typename T1, typename T2> using indexed_map = tree<T1, T2, less<T1>, rb_tree_tag, tree_order_statistics_node_update>; template <typename T> using indexed_set = indexed_map<T, null_type>; #define loop(x, i) for (int i = 0; i < (x); i++) #define loop1(x, i) for (int i = 1; i <= (x); i++) #define rev(x, i) for (int i = (int)(x) - 1; i >= 0; i--) #define itloop(x) for (auto it = begin(x); x != end(x); it++) #define itrev(x) for (auto it = rbegin(x); x != rend(x); it++) #define INF32 ((int32_t)(2e9 + 1)) #define ALL(x) begin(x), end(x) #define RALL(x) rbegin(x), rend(x) #define removeIn(x, l) l.erase(find(ALL(l), x)) #define pb push_back #define sz(x) (int)(x).size() #define F first #define S second #define var const auto & #define foreach(l) for (var e : l) typedef int8_t i8; typedef int16_t i16; typedef int32_t i32; typedef int64_t i64; typedef pair<int, int> ii; typedef tuple<int, int, int> iii; typedef tuple<int, int, int, int> iiii; typedef vector<int> vi; typedef vector<i32> vi32; typedef vector<vi> vvi; typedef vector<vvi> vvvi; typedef vector<vi32> vvi32; typedef vector<ii> vii; typedef vector<iii> viii; typedef vector<vii> vvii; typedef vector<viii> vviii; typedef set<int> si; typedef set<ii> sii; typedef set<iii> siii; typedef vector<si> vsi; typedef vector<sii> vsii; typedef vector<vsi> vvsi; typedef vector<string> vstr; typedef vector<vector<string>> vvstr; typedef vector<bool> vb; typedef vector<vb> vvb; vi longest_trip(int N, int D) { if (D >= 2) { vi res(N); iota(ALL(res), 0); if (D == 3) { return res; } si resterend; loop1(N - 1, i) resterend.insert(res[i]); loop1(N - 1, i) { auto it = resterend.begin(); if (are_connected({res[i - 1]}, {*it})) { res[i] = *it; resterend.erase(it); } else { if (resterend.size() == 1) { res.insert(res.begin(), *it); res.pop_back(); return res; } res[i] = *next(it); resterend.erase(next(it)); } } return res; } else { vsi adj(N); for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { if (are_connected({i}, {j})) { // cerr << i << ' ' << j << endl; adj[i].insert(j); adj[j].insert(i); } } } vb vis(N); int cnt = 0; auto dfs = [&](auto &&self, int i) -> void { vis[i] = 1; cnt++; for (int j : adj[i]) { if (!vis[j]) self(self, j); } }; dfs(dfs, 0); vi res; if (cnt != N) { loop(N, i) { if (vis[i] == (cnt >= N / 2)) res.pb(i); } loop(sz(res) - 1, i) assert(adj[res[i]].count(res[i + 1])); return res; } deque<int> path; path.pb(0); int i2 = *adj[0].begin(); path.pb(i2); int i3 = -1; for (int j : adj[i2]) { if (j != 0) { i3 = j; path.pb(i3); break; } } if (i3 == -1) { for (int j : adj[0]) { if (j != i2) { i3 = j; path.push_front(i3); break; } } } deque<int> left; for (int i = 1; i < N; i++) if (i != i2 && i != i3) left.pb(i); while (!left.empty()) { int i = left.back(); left.pop_back(); if (adj[i].count(path[0])) { path.push_front(i); } else if (adj[i].count(path.back())) { path.push_back(i); } else { assert(adj[path[0]].count(path.back())); int newBegin = -1; for (int j = 1; j < sz(path) - 1; j++) { if (adj[i].count(path[j])) { newBegin = j; break; } } if (newBegin == -1) { left.push_front(i); continue; } deque<int> newPath; newPath.pb(i); for (int j = newBegin; j < sz(path); j++) { newPath.pb(path[j]); } for (int j = 0; j < newBegin; j++) { newPath.pb(path[j]); } path = newPath; } } for (int v : path) res.pb(v); assert(sz(res) == N); // loop(sz(res) - 1, i) assert(adj[res[i]].count(res[i + 1])); return res; } throw; return {}; }
#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...