답안 #944635

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
944635 2024-03-13T02:15:49 Z Nhoksocqt1 가장 긴 여행 (IOI23_longesttrip) C++17
15 / 100
801 ms 1112 KB
#ifndef Nhoksocqt1
    #include "longesttrip.h"
#endif // Nhoksocqt1
#include<bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f
#define sz(x) int((x).size())
#define fi first
#define se second
typedef long long ll;
typedef pair<int, int> ii;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int Random(int l, int r) {
    return uniform_int_distribution<int>(l, r)(rng);
}

const int MAXN = 260;

#ifdef Nhoksocqt1

bitset<MAXN> adjp[MAXN], idA, idB, bsA, bsB;
struct Jury {
    int n, d;

    void init(int _n, int _d) {
        n = _n, d = _d;
        int u, v;
        bool check(0);
        while(cin >> u >> v) {
            adjp[u][v] = adjp[v][u] = 1;
            check = 1;
        }

        if(!check) {
            for (int i = 0; i < n; ++i) {
                for (int j = i + 1; j < n; ++j) {
                    for (int k = j + 1; k < n; ++k) {
                        int cnt = adjp[i][j] + adjp[i][k] + adjp[j][k];
                        if(cnt < d) {
                            vector<ii> p;
                            p.push_back(ii(i, j));
                            p.push_back(ii(i, k));
                            p.push_back(ii(j, k));

                            while(cnt < d) {
                                int r = Random(0, 2);
                                if(adjp[p[r].fi][p[r].se])
                                    continue;

                                ++cnt;
                                adjp[p[r].fi][p[r].se] = adjp[p[r].se][p[r].fi] = 1;
                                cout << p[r].fi << ' ' << p[r].se << '\n';
                            }
                        }
                    }
                }
            }
        }
    }

    bool are_connected(vector<int> &A, vector<int> &B) {
        bsA = bsB = idA = idB = 0;
        for (int it = 0; it < sz(A); ++it) {
            bsA |= adjp[A[it]];
            idA[A[it]] = 1;
        }

        for (int it = 0; it < sz(B); ++it) {
            bsB |= adjp[B[it]];
            idB[B[it]] = 1;
        }

        return ((bsA & idB).count() > 0 || (bsB & idA).count() > 0);
    }

} jury;

#endif // Nhoksocqt1

vector<int> A[MAXN];
int nxt[MAXN], numNode;
bool adj[MAXN][MAXN], dx[MAXN];

bool check_are_connected(vector<int> &A, vector<int> &B) {
    #ifdef Nhoksocqt1
        return jury.are_connected(A, B);
    #else
        return are_connected(A, B);
    #endif // Nhoksocqt1
}

int evaluation(int u, int lenNow, int pNxt[]) {
    int nxt[numNode + 1];
    for (int i = 0; i <= numNode; ++i)
        nxt[i] = pNxt[i];

    vector<int> tmp;
    while(1) {
        dx[u] = 1;
        tmp.push_back(u);

        ++lenNow;
        int v(-1), prv(-1);
        for (int i = nxt[numNode], j = numNode; i < numNode; j = i, i = nxt[i]) {
            if(!dx[i] && adj[u][i]) {
                v = i, prv = j;
                break;
            }
        }

        if(v < 0)
            break;

        nxt[prv] = nxt[v];
        u = v;
    }

    while(sz(tmp)) {
        dx[tmp.back()] = 0;
        tmp.pop_back();
    }

    return lenNow;
}

int evaluation2(int u, int lenNow, int pNxt[], vector<int> &ans) {
    int nxt[numNode + 1];
    for (int i = 0; i <= numNode; ++i)
        nxt[i] = pNxt[i];

    vector<int> tmp;
    while(1) {
        dx[u] = 1;
        tmp.push_back(u);

        ++lenNow;
        int maxLen(0), v(-1), prv(-1);
        for (int i = nxt[numNode], j = numNode; i < numNode; j = i, i = nxt[i]) {
            if(!dx[i] && adj[u][i]) {
                int len = evaluation(i, lenNow, nxt);
                if(maxLen < len) {
                    maxLen = len;
                    v = i, prv = j;
                    if(maxLen == numNode)
                        break;
                }
            }
        }

        if(v < 0)
            break;

        nxt[prv] = nxt[v];
        u = v;
    }

    ans = tmp;
    while(sz(tmp)) {
        dx[tmp.back()] = 0;
        tmp.pop_back();
    }

    return lenNow;
}

vector<int> longest_trip(int N, int D) {
    numNode = N;
    if(D == 3) {
        vector<int> ans;
        for (int i = 0; i < numNode; ++i)
            ans.push_back(i);

        return ans;
    }

    for (int u = 0; u < numNode; ++u) {
        for (int v = u + 1; v < numNode; ++v) {
            vector<int> A, B;
            A.push_back(u);
            B.push_back(v);
            adj[u][v] = adj[v][u] = check_are_connected(A, B);
        }
    }

    nxt[numNode] = 0;
    for (int i = 0; i < numNode; ++i) {
        dx[i] = 0;
        nxt[i] = i + 1;
    }

    vector<int> p;
    for (int i = 0; i < numNode; ++i)
        p.push_back(i);

    shuffle(p.begin(), p.end(), rng);
    vector<int> ans;
    for (int it = 0; it < sz(p); ++it) {
        int i(p[it]);
        int len = evaluation2(i, 0, nxt, ans);
        if(len == numNode)
            break;
    }

    return ans;
}

#ifdef Nhoksocqt1

int main(void) {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    #define TASK "longesttrip"
    if(fopen(TASK".inp", "r")) {
        freopen(TASK".inp", "r", stdin);
        freopen(TASK".out", "w", stdout);
    }

    int n, d;
    cin >> n >> d;
    jury.init(n, d);

    vector<int> path = longest_trip(n, d);
    cout << "ANSWER: " << sz(path) << ": ";
    for (int it = 0; it < sz(path); ++it)
        cout << path[it] << ' '; cout << '\n';

    return 0;
}

#endif // Nhoksocqt1
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 181 ms 600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 344 KB Output is correct
2 Correct 23 ms 344 KB Output is correct
3 Correct 123 ms 600 KB Output is correct
4 Correct 380 ms 464 KB Output is correct
5 Correct 750 ms 496 KB Output is correct
6 Correct 6 ms 344 KB Output is correct
7 Correct 24 ms 344 KB Output is correct
8 Correct 127 ms 344 KB Output is correct
9 Correct 313 ms 592 KB Output is correct
10 Correct 674 ms 492 KB Output is correct
11 Correct 801 ms 496 KB Output is correct
12 Correct 754 ms 600 KB Output is correct
13 Correct 738 ms 488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 29 ms 344 KB Output is correct
3 Correct 131 ms 344 KB Output is correct
4 Correct 339 ms 468 KB Output is correct
5 Correct 711 ms 1012 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
7 Correct 26 ms 344 KB Output is correct
8 Correct 115 ms 344 KB Output is correct
9 Correct 257 ms 456 KB Output is correct
10 Correct 681 ms 488 KB Output is correct
11 Correct 707 ms 488 KB Output is correct
12 Correct 734 ms 488 KB Output is correct
13 Correct 696 ms 600 KB Output is correct
14 Correct 6 ms 344 KB Output is correct
15 Incorrect 3 ms 344 KB Incorrect
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 25 ms 344 KB Output is correct
3 Partially correct 123 ms 344 KB Output is partially correct
4 Partially correct 373 ms 464 KB Output is partially correct
5 Partially correct 741 ms 592 KB Output is partially correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 27 ms 344 KB Output is correct
8 Partially correct 135 ms 344 KB Output is partially correct
9 Partially correct 257 ms 344 KB Output is partially correct
10 Partially correct 713 ms 492 KB Output is partially correct
11 Partially correct 792 ms 1112 KB Output is partially correct
12 Partially correct 743 ms 492 KB Output is partially correct
13 Partially correct 754 ms 492 KB Output is partially correct
14 Incorrect 1 ms 344 KB Incorrect
15 Halted 0 ms 0 KB -