Submission #1253152

#TimeUsernameProblemLanguageResultExecution timeMemory
1253152QwertyPiMigrations (IOI25_migrations)C++20
0 / 100
32 ms1208 KiB
#include "migrations.h"
#include <bits/stdc++.h>
#define int long long
#define all(a) begin(a), end(a)
using namespace std;

const int N = 10'000;
const int LGN = 20;
vector<int> G[N];

pair<int, int> dfs(int v, int pa = -1) {
    int ud = v, d = -1;
    for (int u : G[v]) {
        if (u == pa) continue;
        auto [ud2, d2] = dfs(u, v);
        if (d2 > d) ud = ud2, d = d2;
    }
    return {ud, d + 1};
}

int binom(int k, int l) {
    int res = 1;
    for (int i = 1; i <= l; i++) {
        res = res * (k + 1 - i) / i;
    }
    return res;
}

int f(int K, int L) {
    int res = 0;
    for (int l = 0; l <= L; l++) {
        res += binom(K, l) << (l * 2);
    }
    return res;
}

void test() {
    for (int k = 0; k <= 50; k++) {
        for (int l = 0; l <= min(k, 20LL); l++) {
            printf("f(%02d, %02d) = %lld\n", k, l, f(k, l));
        }
    }
    exit(0);
}

vector<pair<int, int>> K {{48, 4}, {6, 3}, {3, 2}, {2, 2}};

void precalc() {

}

int encrypt(int N, int a, int b) {
    assert(a < b);
    int X = 0;
    for (int i = 0; i < a; i++) X += N - 1 - i;
    for (int i = a + 1; i < b; i++) X++;
    return X;
}

pair<int, int> decrypt(int N, int X) {
    int a = 0, b = 1;
    while (X >= N - 1 - a) X -= N - 1 - a, ++a, b = a + 1;
    while (X >= 1) --X, ++b;
    return {a, b};
}

int msg[N];

vector<int> R {0};
vector<int> C {19, 7, 4}, P {12, 3, 2};

pair<int, int> diameter() {
    auto [u, du] = dfs(0);
    auto [v, d] = dfs(u);
    if (u > v) swap(u, v);
    int a = find(all(R), u) - R.begin();
    int b = find(all(R), v) - R.begin();
    return {a, b};
}

int J1, K1;
int32_t send_message(int32_t N, int32_t i, int32_t Pi) {
    for (int x = 0; x < C.size(); x++) {
        int c = C[x], p = P[x];
        if (i == N - c) {
            auto [a, b] = diameter();
            int X = encrypt(R.size(), a, b);
            R = {R[a], R[b]};
            for (int j = 0; j < p; j++) {
                msg[N - c + j] = X % 5;
                X /= 5;
            }
        }
    }
    vector<vector<int>> M1 {
        {0, 1, 2},
        {2, 3, 4},
        {4, 0, 2},
        {2, 4, 1},
        {1, 3, 0}
    };
    if (i == N - 2) {
        G[i].push_back(Pi);
        G[Pi].push_back(i);
        R.push_back(i);
        auto [a, b] = diameter();
        for (int j = 0; j < 5; j++) {
            for (int k = 0; k < 2; k++) {
                if (set<int>{a, b} == set<int>{M1[j][k], M1[j][k + 1]}) {
                    msg[N - 2] = j;
                    J1 = j; K1 = k;
                }
            }
        }
    } else if (i == N - 1) {
        G[i].push_back(Pi);
        G[Pi].push_back(i);
        R.push_back(i);
        auto [a, b] = diameter();
        if (b == 5) {
            for (int k = 0; k < 3; k++) {
                if (M1[J1][k] == a) msg[N - 1] = 2 + k;
            }
        } else {
            for (int k = 0; k < 2; k++) {
                if (set<int>{a, b} == set<int>{M1[J1][k], M1[J1][k + 1]}) {
                    msg[N - 1] = k;
                }
            }
        }
    } else {
        G[i].push_back(Pi);
        G[Pi].push_back(i);
        R.push_back(i);
    }
    return msg[i];
}

pair<int32_t, int32_t> longest_path(vector<int32_t> S) {
    S.insert(S.begin(), 0);
    int prv = 1;
    for (int x = 0; x < C.size(); x++) {
        int c = C[x], p = P[x];
        while (prv < c) R.push_back(prv++);
        int X = 0;
        for (int i = c + p - 1; i >= c; i--) {
            X = X * 5 + S[i];
        }
        auto [a, b] = decrypt(R.size(), X);
        R = {R[a], R[b]};
    }

    R.push_back(N - 4);
    R.push_back(N - 3);
    R.push_back(N - 2);

    vector<vector<int>> M1 {
        {0, 1, 2},
        {2, 3, 4},
        {4, 0, 2},
        {2, 4, 1},
        {1, 3, 0}
    };

    switch (S[N - 1]) {
        case 0:
            return {R[M1[S[N - 2]][0]], R[M1[S[N - 2]][1]]};
        case 1:
            return {R[M1[S[N - 2]][1]], R[M1[S[N - 2]][2]]};
        case 2:
            return {R[M1[S[N - 2]][0]], N - 1};
        case 3:
            return {R[M1[S[N - 2]][1]], N - 1};
        case 4:
            return {R[M1[S[N - 2]][2]], N - 1};
    }
}

Compilation message (stderr)

migrations.cpp: In function 'void test()':
migrations.cpp:40:26: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
   40 |             printf("f(%02d, %02d) = %lld\n", k, l, f(k, l));
      |                       ~~~^                   ~
      |                          |                   |
      |                          int                 long long int
      |                       %02lld
migrations.cpp:40:32: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long long int' [-Wformat=]
   40 |             printf("f(%02d, %02d) = %lld\n", k, l, f(k, l));
      |                             ~~~^                ~
      |                                |                |
      |                                int              long long int
      |                             %02lld
migrations.cpp: In function 'std::pair<int, int> longest_path(std::vector<int>)':
migrations.cpp:177:1: warning: control reaches end of non-void function [-Wreturn-type]
  177 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...