Submission #899632

#TimeUsernameProblemLanguageResultExecution timeMemory
899632SzilLongest Trip (IOI23_longesttrip)C++17
70 / 100
35 ms1228 KiB
#include <bits/stdc++.h> #include "longesttrip.h" using namespace std; vector<int> solve3(int N) { vector<int> ans(N); iota(ans.begin(), ans.end(), 0); return ans; } vector<int> solve2(int N) { queue<int> q; vector<int> ans; for (int i = 0; i < N; i++) { q.push(i); } int extra = -1; while (!q.empty()) { int u = q.front(); q.pop(); ans.emplace_back(u); if (q.empty()) continue; int v = q.front(); if (!are_connected({u}, {v})) { q.pop(); if (q.empty()) { extra = v; } else { q.push(v); } } } vector<int> res; for (int i = 0; i < ans.size(); i++) { if (i == 0 && extra != -1) res.emplace_back(extra); res.emplace_back(ans[i]); } for (int i = 1; i < res.size(); i++) { assert(are_connected({res[i-1]}, {res[i]})); } assert(res.size() == N); return res; } vector<int> merge_vectors(const vector<int> &a, const vector<int> &b) { vector<int> res; for (int i : a) res.emplace_back(i); for (int i : b) res.emplace_back(i); return res; } vector<int> get_interval(const vector<int> &a, int l, int r) { vector<int> res; for (int i = l; i <= r; i++) { res.emplace_back(a[i]); } return res; } int find_connection(const vector<int> &a, const vector<int> &b) { int lo = 0, hi = a.size() - 1; while (lo < hi) { int mid = (lo + hi) / 2; if (are_connected(get_interval(a, lo, mid), b)) { hi = mid; } else { lo = mid + 1; } } return lo; } vector<int> add_to_component(vector<int> comp, int u) { if (comp.empty()) return {u}; if (comp.size() == 1) return {comp.front(), u}; // TODO remove this and only check with binary search if (are_connected({comp.back()}, {u})) { return merge_vectors(comp, {u}); } int idx = find_connection(comp, {u}); if (idx == 0) { return merge_vectors({u}, comp); } vector<int> res1 = {u, comp[idx]}; auto res2 = merge_vectors(res1, get_interval(comp, idx+1, comp.size()-1)); auto res3 = merge_vectors(res2, get_interval(comp, 0, idx-1)); return res3; } vector<int> solve1(int N) { vector<int> a = {0}, b; for (int i = 1; i < N; i++) { if (are_connected(a, {i})) { a = add_to_component(a, i); } else { b = add_to_component(b, i); } } if (b.size() > 0 && are_connected(a, b)) { if (are_connected({a.front()}, {b.front()})) { reverse(a.begin(), a.end()); return merge_vectors(a, b); } if (are_connected({a.back()}, {b.front()})) { return merge_vectors(a, b); } if (are_connected({a.front()}, {b.back()})) { reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); return merge_vectors(a, b); } if (are_connected({a.back()}, {b.back()})) { reverse(b.begin(), b.end()); return merge_vectors(a, b); } int idx_in_a = find_connection(a, b); int idx_in_b = find_connection(b, a); auto res1 = get_interval(a, idx_in_a+1, a.size()-1); auto res2 = merge_vectors(res1, get_interval(a, 0, idx_in_a)); auto res3 = merge_vectors(res2, get_interval(b, idx_in_b, b.size()-1)); auto res4 = merge_vectors(res3, get_interval(b, 0, idx_in_b-1)); return res4; } else { if (a.size() > b.size()) return a; else return b; } } vector<int> longest_trip(int N, int D) { if (D == 3) return solve3(N); if (D == 2) return solve2(N); if (D == 1) return solve1(N); }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> solve2(int)':
longesttrip.cpp:36:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for (int i = 0; i < ans.size(); i++) {
      |                     ~~^~~~~~~~~~~~
longesttrip.cpp:40:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |     for (int i = 1; i < res.size(); i++) {
      |                     ~~^~~~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from longesttrip.cpp:1:
longesttrip.cpp:43:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   43 |     assert(res.size() == N);
      |            ~~~~~~~~~~~^~~~
longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:146:1: warning: control reaches end of non-void function [-Wreturn-type]
  146 | }
      | ^
#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...