Submission #138889

#TimeUsernameProblemLanguageResultExecution timeMemory
138889evpipis자동 인형 (IOI18_doll)C++14
100 / 100
186 ms10768 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

const int len = 3e5+5;
int lef[len], rig[len], arr[len], vis[len], cnt, pos;

int build(int l, int r){
    if (l == r)
        return l;

    int mid = (l+r)/2, cur = ++cnt;
    lef[cur] = build(l, mid);
    rig[cur] = build(mid+1, r);

    //printf("build: l = %d, r = %d\n", l, r);
    //printf("switch = %d, lef = %d, rig = %d\n", -cur, lef[cur], rig[cur]);
    return -cur;
}

int fix(int num, int lim, int j){
    int cur = ++cnt;
    if (num&(1<<j))
        lef[cur] = build(lim+1, lim+(1<<j)), num -= (1<<j), lim += (1<<j);
    else
        lef[cur] = -1;

    if (j == 0)
        rig[cur] = 0;
    else
        rig[cur] = fix(num, lim, j-1);

    //printf("fix: j = %d\n", j);
    //printf("cur = %d, lef = %d, rig = %d\n", -cur, lef[cur], rig[cur]);
    return -cur;
}

void create_circuit(int m, vector<int> A) {
    int n = A.size();
    for (int i = 1; i <= n; i++)
        arr[i] = A[i-1];

    int j = 0;
    while ((1<<j) <= n)
        j++;

    vector<int> C(m+1);
    C[0] = fix(n, 0, j-1);
    for (int i = 1; i <= m; i++)
        C[i] = C[0];

    //printf("c0 = %d\n", C[0]);

    int cur = -1;
    while (cur != 0){
        //printf("cur = %d\n", cur);
        if (!vis[-cur]){
            vis[-cur] ^= 1;
            if (lef[-cur] >= 1)
                lef[-cur] = arr[++pos], cur = C[0];
            else
                cur = lef[-cur];
        }
        else{
            vis[-cur] ^= 1;
            if (rig[-cur] >= 1)
                rig[-cur] = arr[++pos], cur = C[0];
            else
                cur = rig[-cur];
        }
    }

    vector<int> X(cnt), Y(cnt);
    for (int i = 0; i < cnt; i++)
        X[i] = lef[i+1], Y[i] = rig[i+1];

    answer(C, X, Y);
}
/*
4 4
1 2 1 3
*/
#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...