제출 #1321746

#제출 시각아이디문제언어결과실행 시간메모리
1321746benjaminkleyn이주 (IOI25_migrations)C++20
0 / 100
28 ms1192 KiB
#include "migrations.h"
#include <bits/stdc++.h>
using namespace std;

int n;
int P[10000];
vector<int> g[10000];
int dist[10000] = {0};
void dfs(int u, int p = -1)
{
    if (p == -1) dist[u] = 0;
    for (int v : g[u]) if (v != p) {
        dist[v] = dist[u] + 1;
        dfs(v, u);
    }
}

int prev_a, prev_b;
int a, b;
void find_diameter()
{
    prev_a = a;
    prev_b = b;
    a = b = 0;
    dfs(0);
    for (int i = 0; i < n; i++)
        if (dist[i] > dist[a])
            a = i;

    // dfs(a);
    // for (int i = 0; i < n; i++)
    //     if (dist[i] > dist[b])
    //         b = i;
}

bool cancelled = false;
int send_message(int N, int i, int Pi)
{
    n = N;
    g[i].push_back(Pi);
    g[Pi].push_back(i);

    if (i == N - 7) find_diameter();

    if (i >= N - 7) {
        if (cancelled) {
            return 1;
        }
        find_diameter();
        if (a != prev_a) {
            cancelled = true;
            return 0;
        }
        int shift_amount = 2 * (N - 1 - i);
        return ((a >> shift_amount) & 0b11) + 1;
    }
    return 0;
}

pair<int, int> longest_path(vector<int> S)
{
    int N = S.size();
    int res = 0;
    for (int i = N - 1; i >= N - 7 && i > 0; i--) {
        if (S[i] == 0)
            return {0, i};
        int shift_amount = 2 * (N - 1 - i);
        res |= (S[i] - 1) << shift_amount;
    }
    return {0, res};
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...