답안 #116380

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
116380 2019-06-12T11:15:51 Z zubec 자동 인형 (IOI18_doll) C++14
0 / 100
1 ms 276 KB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 200100;

int dir[N*4], n, sz;

pair<int, int> pr[N];

int kolsons = 1;

void add(int v, int l, int r, int x){
    if (l == r){
        //cout << "kek " << v << ' ' << v/2-sz/2+1 << ' ' << x << endl;
        if (v % 2)
            pr[v/2-sz/2+1].first = x; else
            pr[v/2-sz/2+1].second = x;
        return;
    }
    int mid = (l+r)>>1;
    if (dir[v] == 0){
        add(v+v, l, mid, x);
    } else {
        add(v+v+1, mid+1, r, x);
    }
    dir[v] ^= 1;
}

bool used[N];

vector <int> vec;

void dfs(int v, int l, int r){
    if (l == r)
        return;
    if (pr[v].first == -1 && pr[v].second == -1){
        used[v] = 1;
        return;
    }
    int mid = (l+r)>>1;
    bool bb = 0;
    if (pr[v].first != -1){
        dfs(pr[v].first, l, mid);
        if (!used[pr[v].first])
            bb = 1;
    }
    if (pr[v].second != -1){
        dfs(pr[v].second, mid+1, r);
        if (!used[pr[v].second])
            bb = 1;
    }
    if (bb == 0)
        used[v] = 1;
    vec.push_back(v);
}

void create_circuit(int M, std::vector<int> A) {
    n = A.size();
    vector <int> C, X, Y;
    if (n == 1){
        C.push_back(A[0]);
        for (int i = 1; i <= M; i++)
            C.push_back(0);
        answer(C, X, Y);
        return;
    }
    kolsons = 1;
    sz = 1;
    while(sz < n)
        sz += sz;
    for (int i = 2; i <= n; i++){
        add(1, 1, sz, A[i-1]);
    }
    for (int i = n; i < sz; i++){
        add(1, 1, sz, -1);
    }
    add(1, 1, sz, 0);
    dfs(1, 1, sz);
    C.push_back(A[0]);
    for (int i = 1; i <= M; i++)
        C.push_back(-1);
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    for (int i = 1; i <= kolsons; i++){
        if (pr[i].first != -1){
            pr[i].first = -(lower_bound(vec.begin(), vec.end(), abs(pr[i].first))-vec.begin()+1);
        }
        if (pr[i].second != -1){
            pr[i].second = -(lower_bound(vec.begin(), vec.end(), abs(pr[i].second))-vec.begin()+1);
        }
        X.push_back(pr[i].first);
        Y.push_back(pr[i].second);
    }

    answer(C, X, Y);
}

/**

4 4
1 2 1 3

*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB wrong serial number
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB wrong serial number
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB wrong serial number
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 276 KB wrong serial number
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB over 20000000 inversions
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB over 20000000 inversions
2 Halted 0 ms 0 KB -