제출 #587081

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

using namespace std;


vector<int> x;
vector<int> y;
void createTree (int v, int n, int next, int &count) {
    if (n > next/2) {
        if (next == 2) {
            x[v] = -2;
            y[v] = -2;
            return;
        }
        x[v] = count+1;
        y[v] = count+2;
        count += 2;

        createTree(x[v], next/2, next/2, count);
        createTree(y[v], n-(next/2), next/2, count);
    }
    else {
        if (next == 2) {
            x[v] = -2;
            y[v] = 0;
            return;
        }
        x[v] = count+1;
        y[v] = 0;
        count += 1;

        createTree(x[v], n, next/2, count);
    }
}





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



    if (N == 1) {
        vector<int> ans(M+1);
        ans[0] = A[0];
        answer(ans, {}, {});
        return;
    }


    x.assign(2*N, -1);
    y.assign(2*N, -1);
    // x.push_back(-1);
    // y.push_back(-1);


    int next = 1;
    while (next < N) {
        next *= 2;
    }

    // cerr << next << "\n";

    int count = 0;
    createTree(0, N, next, count);

    swap(x, y);

    // cerr << count << "\n";
    // for (int i = 0; i<N*2; i++) {
    //     cerr << x[i] << " " << y[i] << "\n";
    // }

    vector<int> c(M+1);

    c[0] = A[0];

    for (int i=1; i<=M; i++) c[i] = -1;


    vector<bool> swi(2*N, 0);

    A.push_back(0);

    vector<int> finalX, finalY;

    for (int i = 0; i<2*N; i++) {
        finalX.push_back(-(x[i]+1));
        finalY.push_back(-(y[i]+1));
    }


    // cerr << "\n";

    // for (int i=0; i<2*N; i++) {
    //     cerr << finalX[i] << " " << finalY[i] << "\n";
    // }

    for (int i=1; i<=N; i++) {
        int v = 0;
        while (true) {
            int now;
            if(swi[v]) now = y[v];
            else now = x[v];

            if (now == -2) {
                if(swi[v]) finalY[v] = A[i];
                else finalX[v] = A[i];
                swi[v] = !swi[v];
                break;
            }
            swi[v] = !swi[v];
            v = now;
        }
    }

    // cerr << "\n";

    // for (int i=0; i<2*N; i++) {
    //     cerr << finalX[i] << " " << finalY[i] << "\n";
    // }


    vector<int> resX(count+1);
    vector<int> resY(count+1);

    for (int i=0; i<=count; i++) {
        resX[i] = finalX[i];
        resY[i] = finalY[i];
    }

    answer(c, resX, resY);

}
#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...