답안 #960596

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
960596 2024-04-10T16:38:22 Z TAhmed33 가장 긴 여행 (IOI23_longesttrip) C++17
0 / 100
1 ms 344 KB
#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;
int cnt;
vector <int> tree[256];
bool vis[256];
vector <int> x;
int p[256];
set <int> unvis;
void dfs (int pos) {
    vis[pos] = 1; x.push_back(pos); unvis.erase(pos);
    while (true) {
        vector <int> t; for (auto i : unvis) t.push_back(i);
        if (!are_connected({pos}, t)) break;
        int l = 0, r = (int)t.size() - 1, ans = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            vector <int> g;
            for (int i = 0; i <= mid; i++) g.push_back(t[i]);
            cnt++; assert(cnt <= 3000);
            if (are_connected({pos}, g)) {
                r = mid - 1; ans = mid; 
            } else {
                l = mid + 1;
            }
        }
        if (ans == -1) break;
        tree[pos].push_back(t[ans]);
        p[t[ans]] = pos;
        dfs(t[ans]);
    }
}
int get (int x) {
    if (tree[x].empty()) return x;
    return get(tree[x][0]);
}
vector <int> longest_trip (int n, int d) {
    cnt = 0;
    unvis.clear(); for (int i = 0; i < n; i++) unvis.insert(i);
    for (int i = 0; i < n; i++) tree[i].clear();
    memset(p, -1, sizeof(p));
    memset(vis, 0, sizeof(vis));
    x.clear(); dfs(0);
    if (!unvis.empty()) {
        vector <int> ret = x;
        for (int i = 0; i < n; i++) {
            if (!vis[i]) {
                x.clear(); dfs(i);
                if ((int)x.size() > (int)ret.size()) ret = x;
            }
        }
        return ret;
    }
    int pos = -1;
    for (int i = 0; i < n; i++) {
        if ((int)tree[i].size() == 2) {
            pos = i;
        }
    }
    if (pos == -1) return x;
    int u = get(tree[pos][0]), v = get(tree[pos][1]);
    if (p[pos] != -1 && !are_connected({p[pos]}, {u})) {
        swap(u, v); swap(tree[pos][0], tree[pos][1]);
    }
    u = tree[pos][0], v = tree[pos][1];
    while (!x.empty() && x.back() != p[pos]) x.pop_back();
    vector <int> l;
    while (true) {
        l.push_back(u);
        if (tree[u].empty()) break;
        u = tree[u][0];
    }
    reverse(l.begin(), l.end());
    for (auto i : l) x.push_back(i);
    x.push_back(pos);
    while (true) {
        x.push_back(v);
        if (tree[v].empty()) break;
        v = tree[v][0];
    }
    return x;   
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB invalid array
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB invalid array
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB invalid array
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB invalid array
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB invalid array
2 Halted 0 ms 0 KB -