답안 #944634

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
944634 2024-03-13T02:14:14 Z Nhoksocqt1 가장 긴 여행 (IOI23_longesttrip) C++17
15 / 100
909 ms 856 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(len == numNode) {
                    maxLen = len;
                    v = i, prv = j;
                }
            }
        }

        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

Compilation message

longesttrip.cpp: In function 'int evaluation2(int, int, int*, std::vector<int>&)':
longesttrip.cpp:139:13: warning: variable 'maxLen' set but not used [-Wunused-but-set-variable]
  139 |         int maxLen(0), v(-1), prv(-1);
      |             ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 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 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 344 KB Output is correct
2 Correct 25 ms 344 KB Output is correct
3 Correct 128 ms 344 KB Output is correct
4 Correct 392 ms 588 KB Output is correct
5 Correct 877 ms 600 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 27 ms 344 KB Output is correct
8 Correct 132 ms 344 KB Output is correct
9 Correct 303 ms 592 KB Output is correct
10 Correct 875 ms 624 KB Output is correct
11 Correct 898 ms 600 KB Output is correct
12 Correct 874 ms 488 KB Output is correct
13 Correct 904 ms 852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 25 ms 344 KB Output is correct
3 Correct 134 ms 344 KB Output is correct
4 Correct 390 ms 464 KB Output is correct
5 Correct 883 ms 492 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
7 Correct 25 ms 596 KB Output is correct
8 Correct 130 ms 524 KB Output is correct
9 Correct 301 ms 460 KB Output is correct
10 Correct 874 ms 488 KB Output is correct
11 Correct 878 ms 856 KB Output is correct
12 Correct 909 ms 492 KB Output is correct
13 Correct 853 ms 488 KB Output is correct
14 Correct 8 ms 344 KB Output is correct
15 Incorrect 0 ms 344 KB Incorrect
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 22 ms 344 KB Output is correct
3 Partially correct 130 ms 344 KB Output is partially correct
4 Partially correct 411 ms 460 KB Output is partially correct
5 Partially correct 891 ms 600 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 123 ms 344 KB Output is partially correct
9 Partially correct 300 ms 856 KB Output is partially correct
10 Partially correct 862 ms 708 KB Output is partially correct
11 Partially correct 890 ms 496 KB Output is partially correct
12 Partially correct 891 ms 488 KB Output is partially correct
13 Partially correct 895 ms 600 KB Output is partially correct
14 Incorrect 1 ms 344 KB Incorrect
15 Halted 0 ms 0 KB -