제출 #1344532

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

using namespace std;

void create_circuit(int m, vector<int> a) {
    int n = a.size();
    vector<int> c(m + 1), x, y, xl, yl, st;
    int t = 1;
    auto build = [&](const auto &build, int v, int sz) -> void {
        x.push_back(-1);
        y.push_back(-1);
        xl.push_back(0);
        yl.push_back(0);
        st.push_back(0);
        if (sz == 2) return;
        x[v] = t++;
        xl[v] = -(x[v] + 1);
        build(build, x[v], sz >> 1);
        y[v] = t++;
        yl[v] = -(y[v] + 1);
        build(build, y[v], sz >> 1);
    };
    vector<pair<int, int>> vv;
    auto insert = [&](const auto &insert, int v) -> void {
        if (st[v]) {
            st[v] = 0;
            if (y[v] != -1) {
                insert(insert, y[v]);
            } else {
                vv.push_back({v, 1});
            }
        } else {
            st[v] = 1;
            if (x[v] != -1) {
                insert(insert, x[v]);
            } else {
                vv.push_back({v, 0});
            }
        }
    };
    for (int i = 0; i <= m; i++) {
        c[i] = -1;
    }
    n++;
    a.push_back(0);
    int l = 1;
    while (l < n) {
        l *= 2;
    }
    build(build, 0, l);
    for (int j = 0; j < l; j++) {
        insert(insert, 0);
    }
    for (int j = 0; j < l - n; j++) {
        if (vv[j].second == 0) {
            xl[vv[j].first] = -1;
        } else {
            yl[vv[j].first] = -1;
        }
    }
    for (int j = l - n; j < l; j++) {
        if (vv[j].second == 0) {
            xl[vv[j].first] = a[j - l + n];
        } else {
            yl[vv[j].first] = a[j - l + n];
        }
    }
    answer(c, xl, yl);
}
#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...