제출 #593461

#제출 시각아이디문제언어결과실행 시간메모리
593461pakhomoveeSpeedrun (RMI21_speedrun)C++17
100 / 100
234 ms928 KiB
#include "speedrun.h"
#include <vector>
#include <iostream>
#include <set>

using namespace std;

vector<pair<int, int>> gg;
vector<int> ord;
vector<int> ids;
int id = 0;

void dfs(int v, vector<vector<int>> &g, int p) {
    gg[v].first = p;
    ord.push_back(v);
    ids[v] = id++;
    for (int u : g[v]) {
        if (u != p) {
            dfs(u, g, v);
        }
    }
}

void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */
    setHintLen(20);
    vector<vector<int>> g(N);
    for (int i = 1; i < N; ++i) {
        int u = A[i], v = B[i];
        --u; --v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    gg.resize(N);
    ids.resize(N);
    dfs(0, g, 0);
    for (int i = 0; i < N; ++i) {
        gg[i].second = ord[(ids[i] + 1) % N];
    }
    for (int i = 0; i < N; ++i) {
        int val = gg[i].first * (1 << 10) + gg[i].second;
        //cout << i << ' ' << gg[i].second << endl;
        for (int j = 0; j < 20; ++j) {
            if ((1 << j) & val) {
                setHint(i + 1, j + 1, 1);
            } else {
                setHint(i + 1, j + 1, 0);
            }
        }
    }
    cout << endl;
}

set<int> vis;
int n;

void work(int v, int nx) {
    vis.insert(v);
    int nxt = 0;
    int par = 0;
    for (int j = 0; j < 10; ++j) {
        nxt += (1 << j) * getHint(j + 1);
    }
    for (int j = 10; j < 20; ++j) {
        par += (1 << (j - 10)) * getHint(j + 1);
    }
    if (nx == -1) {
        nx = nxt;
    }
    if (vis.size() == n) {
        return;
    }
    //cout << v << ' ' << par << ' ' << nxt << endl;
    if (goTo(nx + 1)) {
        work(nx, -1);
    } else {
        goTo(par + 1);
        work(par, nx);
    }
}

void speedrun(int subtask, int N, int start) { /* your solution here */
    n = N;
    work(start - 1, -1);
}

컴파일 시 표준 에러 (stderr) 메시지

speedrun.cpp: In function 'void work(int, int)':
speedrun.cpp:69:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   69 |     if (vis.size() == n) {
      |         ~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...