답안 #899639

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
899639 2024-01-06T16:22:52 Z Szil 가장 긴 여행 (IOI23_longesttrip) C++17
15 / 100
14 ms 600 KB
#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> merge_components(vector<int> &a, vector<int> &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;
}

using S = pair<int, vector<int>>;

bool operator<(const S &a, const S &b) {
    return a.first < b.first;
}

vector<int> solve1(int N) {
    priority_queue<S, vector<S>, greater<S>> pq;
    vector<S> done;
    for (int i = 1; i < N; i++) {
        pq.push({1, {i}});
    }
    while (!pq.empty()) {
        S x = pq.top(); pq.pop();
        stack<S> st;
        vector<int> res;
        while (!pq.empty()) {
            S y = pq.top(); pq.pop();
            if (are_connected(x.second, y.second)) {
                res = merge_components(x.second, y.second);
            } else {
                st.push(y);
            }
        }
        if (res.empty()) done.emplace_back(x);
        else pq.push({res.size(), res});
        while (!st.empty()) {
            pq.push(st.top());
            st.pop();
        }
    }
    sort(done.begin(), done.end());
    return done.back().second;
}

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

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:167:1: warning: control reaches end of non-void function [-Wreturn-type]
  167 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 14 ms 344 KB Output is correct
3 Correct 10 ms 344 KB Output is correct
4 Correct 9 ms 344 KB Output is correct
5 Correct 8 ms 344 KB Output is correct
6 Correct 9 ms 344 KB Output is correct
7 Correct 8 ms 344 KB Output is correct
8 Correct 10 ms 344 KB Output is correct
9 Correct 11 ms 600 KB Output is correct
10 Correct 9 ms 504 KB Output is correct
11 Correct 9 ms 344 KB Output is correct
12 Correct 9 ms 344 KB Output is correct
13 Correct 8 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 344 KB Output is correct
2 Incorrect 0 ms 344 KB Incorrect
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -