Submission #847211

#TimeUsernameProblemLanguageResultExecution timeMemory
84721112345678Mechanical Doll (IOI18_doll)C++17
18 / 100
79 ms10388 KiB
#include "doll.h"
#include <bits/stdc++.h>

using namespace std;

const int nx=2e5+1000;
int cnt, mx, used, id;
vector<int> v, X(nx), Y(nx), nv;

void add(int idx, int layer)
{
    used=max(used, idx);
    if (layer==mx)
    {
        if (cnt>=1) Y[idx-1]=v[cnt--], X[idx-1]=v[cnt--];
        else if (cnt==0) Y[idx-1]=v[cnt--], X[idx-1]=-1;
    }
    else
    {
        int sid=id+1;
        add(++id, layer+1);
        Y[idx-1]=-sid;
        sid=id+1;
        if (cnt>=0) add(++id, layer+1), X[idx-1]=-sid;
        else X[idx-1]=-1;
    }
}

void create_circuit(int M, std::vector<int> A) {
    vector<int> C(M+1);
    for (int i=0; i<=M; i++) C[i]=-1;
    v=A;
    v.push_back(0);
    int N=v.size();
    cnt=N-1; mx=ceil(log2(N));
    reverse(v.begin(), v.end());
    for (int i=0; i<(1<<mx); i++)
    {
        int vl=0;
        for (int j=mx-1; j>=0; j--)
        {
            if ((i/(1<<j))%2!=0) vl+=(1<<(mx-j-1));
        }
        if (vl<N) nv.push_back(v[vl]);
    }
    v=nv;
    reverse(v.begin(), v.end());
    add(++id, 1);
    X.resize(used); Y.resize(used);
    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...