제출 #1327750

#제출 시각아이디문제언어결과실행 시간메모리
1327750SpyrosAliv가장 긴 여행 (IOI23_longesttrip)C++20
70 / 100
37 ms440 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;

int n;

std::vector<int> longest_trip(int N, int D)
{
    n = N;
    vector<int> path;
    vector<bool> used(n, false);
    path.push_back(0);
    used[0] = true;
    while (path.size() != n) {
        int lst = path.back();
        vector<int> cands;
        for (int i = 0; i < n; i++) {
            if (!used[i]) cands.push_back(i);
        }
        bool conn = are_connected({path.back()}, {cands});
        if (!conn) {
            break;
        }
        int nxt = -1;
        int lo = 0, hi = cands.size() - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            vector<int> qr;
            for (int j = 0; j <= mid; j++) {
                qr.push_back(cands[j]);
            }
            bool conn = are_connected({path.back()}, qr);
            if (conn) {
                nxt = qr.back();
                hi = mid-1;
            }
            else lo = mid+1;
        }
        assert(are_connected({path.back()}, {nxt}));
        path.push_back(nxt);
        used[nxt] = true;
    }
    if (path.size() == n) return path;
    vector<int> comp2;
    for (int i = 0; i < n; i++) {
        if (!used[i]) {
            comp2.push_back(i);
        }
    }
    if (!are_connected(path, comp2)) {
        if (path.size() > comp2.size()) return path;
        return comp2;
    }
    if (are_connected({path[0]}, {comp2})) {
        int nxt = -1;
        int lo = 0, hi = comp2.size() - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            vector<int> qr;
            for (int j = 0; j <= mid; j++) {
                qr.push_back(comp2[j]);
            }
            bool conn = are_connected({path[0]}, qr);
            if (conn) {
                nxt = qr.back();
                hi = mid-1;
            }
            else lo = mid+1;
        }
        vector<int> ans;
        for (auto x: comp2) {
            if (x != nxt) ans.push_back(x);
        }
        ans.push_back(nxt);
        for (auto x: path) ans.push_back(x);
        return ans;
    }
    else { // path is actually a big cycle
        int u = -1;
        int lo = 0, hi = path.size() - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            vector<int> qr;
            for (int j = 0; j <= mid; j++) {
                qr.push_back(path[j]);
            }
            bool conn = are_connected(qr, comp2);
            if (conn) {
                u = mid;
                hi = mid-1;
            }
            else lo = mid+1;
        }
        int v = -1;
        lo = 0, hi = comp2.size() - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            vector<int> qr;
            for (int j = 0; j <= mid; j++) {
                qr.push_back(comp2[j]);
            }
            bool conn = are_connected({path[u]}, qr);
            if (conn) {
                v = qr.back();
                hi = mid-1;
            }
            else lo = mid+1;
        }
        vector<int> ans;
        for (int i = u+1; i < path.size(); i++) ans.push_back(path[i]);
        for (int i = 0; i <= u; i++) ans.push_back(path[i]);
        ans.push_back(v);
        for (auto x: comp2) {
            if (x != v) ans.push_back(x);
        }
        return ans;
    }
    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...