제출 #1147247

#제출 시각아이디문제언어결과실행 시간메모리
1147247woohyun_jng자동 인형 (IOI18_doll)C++20
100 / 100
84 ms40344 KiB
#include "doll.h"
#include <bits/stdc++.h>

#define MAX 400000

using namespace std;

int cnt = 0, leaf = 0, K = 1, val[MAX], tree[MAX], state[MAX], X[MAX], Y[MAX];
vector<int> order;

int dfs(int n) {
    if (tree[n] == -1)
        return tree[n];
    else if (tree[n] == 1)
        return tree[n] = ++leaf;

    tree[n] = -(++cnt), X[-tree[n]] = dfs(n << 1), Y[-tree[n]] = dfs(n << 1 | 1);
    return tree[n];
}

void simulate(int n) {
    if (order.size() == leaf)
        return;
    if (tree[n] >= 0)
        order.push_back(tree[n]), simulate(1);
    else if (n != 1 && tree[n] == -1)
        simulate(1);

    state[n] ^= 1;
    simulate(state[n] ? (n << 1) : (n << 1 | 1));
}

void create_circuit(int M, vector<int> A) {
    A.push_back(0);
    int N = A.size();

    vector<int> C(M + 1, -1), ansX, ansY;

    if (N == 2) {
        fill(C.begin(), C.end(), 0), C[0] = A[0];
        answer(C, ansX, ansY);
        return;
    }

    while (K <= N)
        K <<= 1;

    fill(tree + K, tree + (K << 1) - N, -1), fill(tree + (K << 1) - N, tree + (K << 1), 1);
    for (int i = K; i > 1; i--)
        if (tree[i << 1] == -1 && tree[i << 1 | 1] == -1)
            tree[i] = -1;

    dfs(1), simulate(1);
    for (int i = 0; i < leaf; i++)
        val[order[i]] = A[i];

    ansX.resize(cnt), ansY.resize(cnt);
    for (int i = 0; i < cnt; i++)
        ansX[i] = X[i + 1] >= 0 ? val[X[i + 1]] : X[i + 1], ansY[i] = Y[i + 1] >= 0 ? val[Y[i + 1]] : Y[i + 1];
    answer(C, ansX, ansY);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...