제출 #278764

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

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

#define fi first
#define se second
#define mp make_pair

int n;

const int N = (int)2e5 + 10;
int x[N], y[N];
int flip[N];
int id = 1;
int p = 1;

int build(int l, int r){
    if(l >= r) return 0;
    if(r + n <= p - 1) return -1;
    int cur = id++;
    int mid = (l + r) / 2;
    x[cur] = build(l, mid);
    y[cur] = build(mid + 1, r);
    return -cur;
}

void put(int xv){
    int cur = -1;
    int real;
    int nx;
    while(1){
        real = -cur;
        if(flip[real]){
            nx = y[real];
            flip[real] = false;
            if(nx == 0){
                y[real] = xv;
                return;
            }
            else{
                cur = nx;
            }
        }
        else{
            nx = x[real];
            flip[real] = true;
            if(nx == 0){
                x[real] = xv;
                return;
            }
            else{
                cur = nx;
            }
        }
    }
}

void create_circuit(int M, vector<int> A) {
    n = A.size();
    while(p < n)
        p *= 2;
    build(0, p - 1);
    vector<int> C(M + 1);
    C[0] = A[0];
    for(int i = 1; i <= M; i ++ )
        C[i] = -1;
    for(int i = 1; i < n ; i ++ )
        put(A[i]);
    if(n % 2 == 1)
        put(-1);
    put(0);
    vector<int> xx, yy;
    for(int i = 1; i < id; i ++ ){
        xx.push_back(x[i]);
        yy.push_back(y[i]);
    }
    answer(C, xx, yy);
}
#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...