제출 #1150396

#제출 시각아이디문제언어결과실행 시간메모리
1150396marvinthang가장 긴 여행 (IOI23_longesttrip)C++17
100 / 100
5 ms420 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> longest_trip(int N, int D) {
    auto connected = [&] (int u, int v) { return are_connected({u}, {v}); };
    vector <int> path;
    if (D == 3) {
        path.resize(N);
        iota(path.begin(), path.end(), 0);
    } else if (D == 2) {
        if (!connected(0, 1)) path = {0, 2, 1};
        else if (!connected(0, 2)) path = {0, 1, 2};
        else path = {1, 0, 2};
        for (int i = 3; i < N; ++i) {
            if (!connected(i, path.back())) path.insert(path.begin(), i);
            else path.push_back(i);
        }
    } else {
        vector <int> left{0}, right{1};
        bool last = false;
        for (int i = 2; i < N; ++i) {
            if (connected(left.back(), i)) {
                left.push_back(i);
                last = false;
            } else if (last || connected(right.back(), i)) {
                right.push_back(i);
                last = true;
            } else {
                left.insert(left.end(), right.rbegin(), right.rend());
                right = {i};
                last = false;
            }
        }
        if (left.size() < right.size()) swap(left, right);
        if (right.empty() || !are_connected(left, right)) return left;
        for (int t = 0; t < 2; ++t) {
            if ((int) left.size() > 1) {
                if (connected(left.back(), right.back())) {
                    left.insert(left.end(), right.rbegin(), right.rend());
                    return left;
                } else if (connected(left[0], right.back())) {
                    right.insert(right.end(), left.begin(), left.end());
                    return right;
                }
            }
            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(), right.begin(), right.end());
        return left;
    }
    return path;
}
#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...