답안 #571930

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
571930 2022-06-03T07:39:52 Z elazarkoren 자동 인형 (IOI18_doll) C++17
100 / 100
155 ms 22108 KB
#include "doll.h"
#include <bits/stdc++.h>
#define x first
#define y second
#define all(v) v.begin(), v.end()
#define chkmin(a, b) a = min(a, b)
#define chkmax(a, b) a = max(a, b)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vii;

vi X, Y;

struct Node {
    Node *x = 0, *y = 0;
    bool state = false;
    int left_son = 0, right_son = 0;
    int sz = 2;
    Node(int d) {
        if (!d) {
            return;
        }
        x = new Node(d - 1);
        y = new Node(d - 1);
        left_son = 1, right_son = 1;
        sz = x->sz + y->sz;
    }
    void First(int &a) {
        if (!x) {
            right_son = 1;
            a--;
            if (a > 0) {
                left_son = 1;
                a--;
            }
            return;
        }
        y->First(a);
        if (a > 0) x->First(a);
    }
    bool Delete() {
        if (!x) {
            return !left_son && !right_son;
        }
        if (y->Delete()) {
            delete y;
            right_son = 0;
            y = 0;
        }
        if (x->Delete()) {
            delete x;
            left_son = 0;
            x = 0;
        }
        sz = (x ? x->sz : 1) + (y ? y->sz : 1);
        return !left_son && !right_son;
    }
    bool Add(int a) {
        state = !state;
        if (state) {
            if (!x) {
                if (left_son <= 0) {
                    left_son = -1;
                    return false;
                }
                left_son = a;
                return true;
            }
            return x->Add(a);
        }
        else {
            if (!y) {
                if (right_son <= 0) {
                    right_son = -1;
                    return false;
                }
                right_son = a;
                return true;
            }
            return y->Add(a);
        }
    }
    int Create() {
        int node = X.size();
        X.push_back(-1), Y.push_back(-1);
        if (!x) X[node] = left_son;
        else {
            int a = x->Create();
            X[node] = a;
        }
        if (!y) Y[node] = right_son;
        else {
            int a = y->Create();
            Y[node] = a;
        }
        node = -node - 1;
        return node;
    }
};

int Solve(vi &v) {
    int n = v.size();
    int bit = 0;
    for (int a = 1; a < n; bit++, a <<= 1);
    bit--;
    Node tree(bit);
    tree.First(n);
    n = v.size();
    tree.Delete();
//    for (int i = n; i < tree.sz; i++) tree.Add(-1);
    for (int i = 0; i < n; i++) {
        while (!tree.Add(v[i]));
    }
//    tree.Add(v.back());
    tree.Create();
    return -1;
}

void create_circuit(int m, std::vector<int> a) {
    X.clear(), Y.clear();
    int n = a.size();
    a.push_back(0);
    int t = a[0];
    a.erase(a.begin());
    if (a.size() == 1 || a.empty()) {
        vi c(m + 1, 0);
        c[0] = t;
        answer(c, X, Y);
        return;
    }
    Solve(a);
    vi c(m + 1, -1);
    c[0] = t;
    answer(c, X, Y);
}
//5 14
//1 2 3 3 2 5 1 1 2 1 4 3 4 3

//1 7
//1 1 1 1 1 1 1

//1 20
//1 1 1 1 1

Compilation message

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:124:9: warning: unused variable 'n' [-Wunused-variable]
  124 |     int n = a.size();
      |         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 42 ms 7164 KB Output is correct
3 Correct 57 ms 9036 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 15 ms 1364 KB Output is correct
6 Correct 69 ms 12240 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 42 ms 7164 KB Output is correct
3 Correct 57 ms 9036 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 15 ms 1364 KB Output is correct
6 Correct 69 ms 12240 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
8 Correct 76 ms 13636 KB Output is correct
9 Correct 109 ms 16580 KB Output is correct
10 Correct 141 ms 22108 KB Output is correct
11 Correct 1 ms 308 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 42 ms 7164 KB Output is correct
3 Correct 57 ms 9036 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 15 ms 1364 KB Output is correct
6 Correct 69 ms 12240 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
8 Correct 76 ms 13636 KB Output is correct
9 Correct 109 ms 16580 KB Output is correct
10 Correct 141 ms 22108 KB Output is correct
11 Correct 1 ms 308 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 142 ms 21640 KB Output is correct
15 Correct 106 ms 15900 KB Output is correct
16 Correct 134 ms 21488 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 304 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 142 ms 21636 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 85 ms 12504 KB Output is correct
3 Correct 96 ms 15204 KB Output is correct
4 Correct 141 ms 20652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 85 ms 12504 KB Output is correct
3 Correct 96 ms 15204 KB Output is correct
4 Correct 141 ms 20652 KB Output is correct
5 Correct 131 ms 21420 KB Output is correct
6 Correct 140 ms 21380 KB Output is correct
7 Correct 155 ms 21396 KB Output is correct
8 Correct 133 ms 21296 KB Output is correct
9 Correct 104 ms 15196 KB Output is correct
10 Correct 131 ms 21260 KB Output is correct
11 Correct 124 ms 20996 KB Output is correct
12 Correct 83 ms 15476 KB Output is correct
13 Correct 72 ms 12880 KB Output is correct
14 Correct 82 ms 15760 KB Output is correct
15 Correct 80 ms 15712 KB Output is correct
16 Correct 2 ms 724 KB Output is correct
17 Correct 81 ms 12676 KB Output is correct
18 Correct 88 ms 12692 KB Output is correct
19 Correct 82 ms 15384 KB Output is correct
20 Correct 128 ms 21124 KB Output is correct
21 Correct 150 ms 20944 KB Output is correct
22 Correct 148 ms 21120 KB Output is correct