Submission #292724

#TimeUsernameProblemLanguageResultExecution timeMemory
292724Hideo자동 인형 (IOI18_doll)C++17
100 / 100
136 ms15648 KiB
#include "doll.h"
//#include "grader.cpp"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define fr first
#define sc second
#define pi pair < int, int >
#define vi vector < int >
#define pb push_back

const int MAXN = 4e5 + 7;
const int con = 3e7 + 7;

vi a, C, X, Y;
int n, sz, t, c;

struct sw{
    int x, y, nxt;
    sw(){
        x = y = nxt = 0;
    }
} s[MAXN];

void build (int v, int l, int r){
    if (l + 1 == r){
        if (sz - l + 1 > n)
            s[v].x = 1;
        return;
    }
    int mid = (l + r) >> 1;
    if (sz - mid + 1 <= n){
        s[v].x = ++t;
        build(t, l, mid);
    }
    else
        s[v].x = 1;
    s[v].y = ++t;
    build(t, mid + 1, r);
}

void reshuffle (int v){
    if (!s[v].nxt){
        s[v].nxt = 1;
        if (s[v].x)
            reshuffle(s[v].x);
        else {
            s[v].x = con + a[++c];
            if (a[c] == 0)
                assert(false);
            reshuffle(1);
        }
    }
    else {
        s[v].nxt = 0;
        if (s[v].y)
            reshuffle(s[v].y);
        else {
            s[v].y = con + a[++c];
            if (a[c] == 0)
                return;
            reshuffle(1);
        }
    }
}

void create_circuit(int M, vector <int> A) {
    a = A;
    n = a.size();
    if (n == 1){
        C.pb(a[0]);
        C.pb(0);
        answer(C, X, Y);
        return;
    }
    t = 1;
    a.pb(0);
    sz = (1 << int(ceil(log2(n))));
    build(1, 1, sz);
    reshuffle(1);
    for (int i = 1; i <= t; i++){
        if (s[i].x < con)
            X.pb(-s[i].x);
        else
            X.pb(s[i].x - con);
        if (s[i].y < con)
            Y.pb(-s[i].y);
        else
            Y.pb(s[i].y - con);
    }
    C.pb(a[0]);
    for (int i = 1; i <= M; i++)
        C.pb(-1);
    answer(C, X, Y);
}
#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...