답안 #857734

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
857734 2023-10-06T18:47:25 Z LucaLucaM Speedrun (RMI21_speedrun) C++17
0 / 100
1 ms 344 KB
#ifndef SPEEDRUN_H_INCLUDED
#define SPEEDRUN_H_INCLUDED

#ifndef LOCAL

#include "speedrun.h"

#endif

#ifdef LOCAL
void assignHints(int subtask, int N, int A[], int B[]);
void speedrun(int subtask, int N, int start);

void setHintLen(int l);
void setHint(int i, int j, bool b);
int getLength();
bool getHint(int j);
bool goTo(int x);
#endif

#include <bits/stdc++.h>

using namespace std;

/**

primii 10 biti sunt parintele si ultimii 10 biti sunt fratele

**/

void assignHints(int subtask, int n, int A[], int B[]) { /* your solution here */
    vector<int> g[n + 1];

    for (int i = 1; i < n; i++) {
        g[A[i]].push_back(B[i]);
        g[B[i]].push_back(A[i]);
    }

    setHintLen(20);

    int amongus = g[1][0];
    for (int j = 0; j < 10; j++) {
        if (amongus & (1 << j)) {
            setHint(1, j + 10, 1);
        } else {
            setHint(1, j + 10, 0);
        }
    }

    vector<int>order;

    function<void(int, int)> dfs = [&] (int u, int p = 0) {
        for (int j = 0; j < 10; j++) {
            if (p & (1 << j)) {
                setHint(u, j, 1);
            } else {
                setHint(u, j, 0);
            }
        }
        order.push_back(u);
        for (const auto &v : g[u]) {
            if (v != p) {
                dfs(v, u);
            }
        }
    };

    dfs(1, 0);

    order.push_back(0);

    for (int i = 1; i < (int) order.size(); i++) {
        for (int j = 0; j < 10; j++) {
            if (order[i] & (1 << j)) {
                setHint(order[i - 1], j + 10, 1);
            } else {
                setHint(order[i - 1], j + 10, 0);
            }
        }
    }
}

void speedrun(int subtask, int n, int u) {
    auto parent = [&] () -> int {
        int ret = 0;
        for (int j = 0; j < 10; j++) {
            if (getHint(j)) {
                ret |= (1 << j);
            }
        }
        return ret;
    };

    auto frt = [&] () -> int {
        int ret = 0;
        for (int j = 0; j < 10; j++) {
            if (getHint(j + 10)) {
                ret |= (1 << j);
            }
        }
        return ret;
    };

    while (parent() != 0) {
        u = parent();
        assert(goTo(parent()));
    }

    bool vis[n + 1] = {};

    while (true) {
//        cout << " > " << u << '\n';
        vis[u] = true;
        if (count(vis + 1, vis + n + 1, true) == n) {
            break;
        }
        int next = frt();
        while (!goTo(next)) {
            u = parent();
            goTo(parent());
        }
        u = next;
    }
}


#endif // SPEEDRUN_H_INCLUDED
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Invalid bit index for setHint
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Invalid bit index for setHint
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Invalid bit index for setHint
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Invalid bit index for setHint
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Invalid bit index for setHint
2 Halted 0 ms 0 KB -