Submission #75239

#TimeUsernameProblemLanguageResultExecution timeMemory
75239mammamiaMechanical Doll (IOI18_doll)C++14
100 / 100
160 ms11612 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;

int tokill, swcnt;
bool state[400555];
vector<int> X(400555), Y(400555);

void build(int root, int height, bool orientation){

    //cout<<root<<" "<<orientation<<" "<<(1<<height)<<" \n";
    if((1<<height) <= tokill){
        tokill-= (1<<height);
        X[root-1] = -1;
        return;
    }

    if(height == 0) {
        return;
    }

    swcnt++;
    if (!orientation) {
        X[root - 1] = -swcnt;
    } else {
        Y[root - 1] = -swcnt;
    }
    int aux = swcnt;
    build(aux, height - 1, 0);
    build(aux, height - 1, 1);

}

int nextElement;

void dfs(int root){
    if(!state[(-root)-1]){
        // X
        state[-root-1] = !state[-root-1];
        if(X[-root-1] >= 0){
            X[-root-1] = nextElement;
        } else {
            dfs(X[-root-1]);
        }
    }else{
        state[-root-1] = !state[-root-1];
        if(Y[-root-1] >= 0){
            Y[-root-1] = nextElement;
        } else {
            dfs(Y[-root-1]);
        }
    }
}

void create_circuit(int M, vector<int> A) {

    int N = A.size();
    A.push_back(0);


    int height = 0;
    int aux = N+1;
    while((1<<(height)) < aux){
        height++;
    }

    //cout<<height<<"\n";
    // exits to kill
    tokill = (1<<height) - (N+1);
    //cout<<"tokill "<<tokill<<"\n";
    swcnt = 1;

    build(1, height-1, 0);
    build(1, height-1, 1);
    vector<int> C (M+1);

    for(int i=0; i<=M; ++i){
        C[i] = -1;
    }

    for(int i=0; i<N+1; ++i){
        nextElement = A[i];
        dfs(-1);
    }

    X.resize(swcnt);
    Y.resize(swcnt);

    /*
    for(auto el: C){
        cout<<el<<" ";
    }
    cout<<"\n";
    for(auto el: X){
        cout<<el<<" ";
    }
    cout<<"\n";
    for(auto el: Y){
        cout<<el<<" ";
    }
    cout<<"\n";
     */
    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...