Submission #235681

#TimeUsernameProblemLanguageResultExecution timeMemory
235681lycMechanical Doll (IOI18_doll)C++14
100 / 100
159 ms12276 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) //cout << #x << " :: " << x << endl;
#define _ << " " <<
#define FOR(i,a,b) for (int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()

const int mxN = 2e5+5;

int M, N;
int D[2*mxN], L[2*mxN], R[2*mxN], state[2*mxN];

int build(int s, int e, int p, int l) {
    int en = p;
    if (l == 1) R[p] = 1;
    else {
        R[p] = -(p+1);
        en = build(max(s,e-l+1),e,-R[p],l>>1);
    }
    if (e-l >= s) {
        if (l == 1) L[p] = 1;
        else {
            L[p] = -(en+1);
            en = build(s,e-l,-L[p],l>>1);
        }
    } else {
        L[p] = -1;
    }
    TRACE(s _ e _ p _ L[p] _ R[p]);
    return en;
}

void simulate(int p, int v) {
    int pos = p;
    for (;;) {
        //TRACE(pos _ state[-pos]);
        state[-pos] = !state[-pos];
        if (state[-pos]) {
            if (L[-pos] > 0) { TRACE(-pos _ "L" _ v); L[-pos] = v; break; }
            else pos = L[-pos];
        } else {
            if (R[-pos] > 0) { TRACE(-pos _ "R" _ v); R[-pos] = v; break; }
            else pos = R[-pos];
        }
    }
}

void create_circuit(int _M, std::vector<int> A) {
    M = _M;
    A.push_back(0);
    N = A.size();
    vector<int> C(M+1,-1);

    int n2 = 1;
    while (n2 < N) n2 <<= 1;
    int S = build(n2-N+1,n2,1,n2>>1);

    for (int& x : A) { simulate(-1,x); }

    vector<int> X(S), Y(S);
    FOR(i,1,S){
        X[i-1] = L[i];
        Y[i-1] = R[i];
        TRACE(i _ X[i-1] _ Y[i-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...