답안 #537002

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
537002 2022-03-14T09:19:56 Z siewjh Speedrun (RMI21_speedrun) C++17
29 / 100
97 ms 684 KB
#include "speedrun.h"
#include <vector>
using namespace std;

void assignHints(int subtask, int N, int A[], int B[]) {
    if (subtask == 1){
        setHintLen(N);
        for (int i = 1; i < N; i++){
            setHint(A[i], B[i], 1);
            setHint(B[i], A[i], 1);
        }
    }
    else if (subtask == 2){
        setHintLen(20);
        vector<int> occur(N + 1, 0);
        for (int i = 1; i < N; i++){
            occur[A[i]]++;
            occur[B[i]]++;
        }
        int centre = 1; // when N is 2
        for (int i = 1; i <= N; i++)
            if (occur[i] > 1){
                centre = i;
                break;
            }
        for (int k = 0; k <= 19; k++)
            if (centre & (1 << k))
                for (int i = 1; i <= N; i++)
                    setHint(i, k + 1, 1);
    }
    else if (subtask == 3){
        setHintLen(20);
        vector<bool> isSet(N + 1, 0);
        for (int i = 1; i < N; i++){
            int x = A[i], y = B[i];
            if (!isSet[x]){
                for (int k = 0; k <= 9; k++)
                    if (y & (1 << k))
                        setHint(x, k + 1, 1);
                isSet[x] = 1;
            }
            else {
                for (int k = 0; k <= 9; k++)
                    if (y & (1 << k))
                        setHint(x, k + 11, 1);
            }
            if (!isSet[y]){
                for (int k = 0; k <= 9; k++)
                    if (x & (1 << k))
                        setHint(y, k + 1, 1);
                isSet[y] = 1;
            }
            else {
                for (int k = 0; k <= 9; k++)
                    if (x & (1 << k))
                        setHint(y, k + 11, 1);
            }
        }
    }
}

void dfs1(int curr, int par, int N){
    for (int i = 1; i <= N; i++){
        if (!getHint(i)) continue;
        if (i == par) continue;
        goTo(i);
        dfs1(i, curr, N);
    }
    if (par != -1) goTo(par);
}

void dfs2(int curr, int par){
    int c1 = 0, c2 = 0;
    for (int k = 0; k <= 9; k++)
        if (getHint(k + 1))
            c1 += (1 << k);
    for (int k = 0; k <= 9; k++)
        if (getHint(k + 11))
            c2 += (1 << k);
    if (c1 != par){
        goTo(c1);
        dfs2(c1, curr);
    }
    if (c2 != par){
        goTo(c2);
        dfs2(c2, curr);
    }
    if (par != -1) goTo(par);
}

void speedrun(int subtask, int N, int start) {
    if (subtask == 1) dfs1(start, -1, N);
    else if (subtask == 2){
        int centre = 0;
        for (int i = 0; i <= 19; i++)
            if (getHint(i + 1))
                centre += (1 << i);
        if (start != centre) goTo(centre);
        for (int i = 1; i <= N; i++)
            if (i != centre){
                goTo(i);
                goTo(centre);
            }
    }
    else if (subtask == 3) dfs2(start, -1);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 544 KB Output is correct
2 Correct 37 ms 632 KB Output is correct
3 Correct 40 ms 652 KB Output is correct
4 Correct 40 ms 664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 552 KB Output is correct
2 Correct 41 ms 544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 97 ms 684 KB Invalid node index to goTo
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 208 KB setHintLen was never called
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 208 KB setHintLen was never called
2 Halted 0 ms 0 KB -