제출 #120380

#제출 시각아이디문제언어결과실행 시간메모리
120380songc자동 인형 (IOI18_doll)C++14
100 / 100
206 ms11712 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;

int N, M, B, S;
int ID[808080], num;
int L[202020], R[202020];
bool st[202020];
vector<int> A;

void index(int id, int s, int e){
    if (s == e || e <= B-N) return;
    ID[id] = ++S;
    int mid = (s+e)/2;
    index(id*2, s, mid);
    index(id*2+1, mid+1, e);
}

void f(int id, int s, int e){
    if (e <= B-N){
        L[ID[id/2]] = -1;
        return;
    }
    if (s == e) return;
    int mid = (s+e)/2;
    f(id*2, s, mid);
    f(id*2+1, mid+1, e);
    if (id & 1) R[ID[id/2]] = -ID[id];
    else L[ID[id/2]] = -ID[id];
}

void create_circuit(int m, std::vector<int> a){
    a.push_back(0);
    N = a.size(), M = m, A = a;
    for (B=1; B<N; B<<=1);
    index(1, 1, B);
    f(1, 1, B);

    for (int i=0; i<N; i++){
        int u=1;
        while (1){
            if (!st[u]){
                if (L[u] == 0){
                    L[u] = A[i];
                    st[u] = !st[u];
                    break;
                }
                else st[u] = !st[u], u=-L[u];
            }
            else{
                if (R[u] == 0){
                    R[u] = A[i];
                    st[u] = !st[u];
                    break;
                }
                else st[u] = !st[u], u=-R[u];
            }
        }
    }

    vector<int> C(M+1, -1);
    vector<int> X, Y;
    for (int i=1; i<=S; i++){
        X.push_back(L[i]);
        Y.push_back(R[i]);
    }
    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...