답안 #764236

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
764236 2023-06-23T09:14:26 Z t6twotwo 자동 인형 (IOI18_doll) C++17
63 / 100
79 ms 10860 KB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> ord(int lg) {
    int N = 1 << lg;
    vector<int> ans(N), s(N);
    int x = 1, t = 0;
    while (1) {
        if (x >= N) {
            ans[x - N] = t++;
            if (x == 2 * N - 1) {
                break;
            }
            x = 1;
        } else {
            if (s[x] == 0) {
                s[x] = 1;
                x = x * 2;
            } else {
                s[x] = 0;
                x = x * 2 + 1;
            }
        }
    }
    return ans;
}
void create_circuit(int M, vector<int> A) {
    int N = A.size();
    if (N == 16) {
        vector<int> C(M + 1, -1), X(15), Y(15);
        for (int i = 0; i < 7; i++) {
            X[i] = ~(2 * i + 1);
            Y[i] = ~(2 * i + 2);
        }
        C[0] = A[0];
        auto a = ord(4);
        for (int i = 0; i < 8; i++) {
            X[i + 7] = A[a[i * 2] + 1];
            Y[i + 7] = i == 7 ? 0 : A[a[i * 2 + 1] + 1];
        }
        answer(C, X, Y);
        return;
    }
    vector<int> f(M + 1);
    for (int i = 0; i < N; i++) {
        f[A[i]]++;
    }
    if (*max_element(f.begin(), f.end()) <= 4) {
        vector<int> S1(M + 1), S2(M + 1), S3(M + 1);
        int K = 0;
        for (int i = 1; i <= M; i++) {
            if (f[i] == 2) {
                S1[i] = K++;
            } else if (f[i] > 2) {
                S1[i] = K++;
                S2[i] = K++;
                S3[i] = K++;
            }
        }
        vector<int> X(K), Y(K), C(M + 1);
        for (int i = 1; i <= M; i++) {
            if (f[i] > 1) {
                C[i] = ~S1[i];
                if (f[i] > 2) {
                    X[S1[i]] = ~S2[i];
                    Y[S1[i]] = ~S3[i];
                    if (f[i] == 3) {
                        Y[S2[i]] = ~S1[i];
                    }
                }
            }
        }
        C[0] = A[0];
        vector<int> cnt(M + 1);
        for (int i = 0; i < N; i++) {
            if (f[A[i]] == 1) {
                C[A[i]] = i + 1 < N ? A[i + 1] : 0;
            } else if (f[A[i]] == 2) {
                if (cnt[A[i]] == 0) {
                    X[S1[A[i]]] = A[i + 1];
                } else {
                    Y[S1[A[i]]] = i + 1 < N ? A[i + 1] : 0;
                }
            } else if (f[A[i]] == 3) {
                if (cnt[A[i]] == 0) {
                    X[S2[A[i]]] = A[i + 1];
                } else if (cnt[A[i]] == 1) {
                    X[S3[A[i]]] = A[i + 1];
                } else {
                    Y[S3[A[i]]] = i + 1 < N ? A[i + 1] : 0;
                }
            } else if (f[A[i]] == 4) {
                if (cnt[A[i]] == 0) {
                    X[S2[A[i]]] = A[i + 1];
                } else if (cnt[A[i]] == 1) {
                    X[S3[A[i]]] = A[i + 1];
                } else if (cnt[A[i]] == 2) {
                    Y[S2[A[i]]] = A[i + 1];
                } else {
                    Y[S3[A[i]]] = i + 1 < N ? A[i + 1] : 0;
                }
            }
            cnt[A[i]]++;
        }
        answer(C, X, Y);
        return;
    }
    int lg = __lg(N - 1) + 1;
    int K = 1 << lg;
    vector<int> C(M + 1, -1), X(K - 1, -1), Y(K - 1, -1);
    C[0] = A[0];
    for (int i = 0; i < (K / 2) - 1; i++) {
        X[i] = ~(2 * i + 1);
        Y[i] = ~(2 * i + 2);
    }
    auto a = ord(lg);
    for (int i = 0; i < K / 2; i++) {
        if (a[i * 2] < N - 1) {
            X[i + K / 2 - 1] = A[a[i * 2] + 1];
        }
        if (a[i * 2 + 1] < N - 1) {
            Y[i + K / 2 - 1] = A[a[i * 2 + 1] + 1];
        }
    }
    Y[K - 2] = 0;
    answer(C, X, Y);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 14 ms 3924 KB Output is correct
3 Correct 15 ms 2900 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 7 ms 1364 KB Output is correct
6 Correct 16 ms 4152 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 14 ms 3924 KB Output is correct
3 Correct 15 ms 2900 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 7 ms 1364 KB Output is correct
6 Correct 16 ms 4152 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 25 ms 4948 KB Output is correct
9 Correct 27 ms 5436 KB Output is correct
10 Correct 38 ms 7364 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 14 ms 3924 KB Output is correct
3 Correct 15 ms 2900 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 7 ms 1364 KB Output is correct
6 Correct 16 ms 4152 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 25 ms 4948 KB Output is correct
9 Correct 27 ms 5436 KB Output is correct
10 Correct 38 ms 7364 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 53 ms 8596 KB Output is correct
15 Correct 27 ms 4692 KB Output is correct
16 Correct 42 ms 6868 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 46 ms 7900 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 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 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 0 ms 212 KB Output is partially correct
2 Correct 37 ms 4904 KB Output is correct
3 Partially correct 66 ms 8392 KB Output is partially correct
4 Partially correct 69 ms 9044 KB Output is partially correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 0 ms 212 KB Output is partially correct
2 Correct 37 ms 4904 KB Output is correct
3 Partially correct 66 ms 8392 KB Output is partially correct
4 Partially correct 69 ms 9044 KB Output is partially correct
5 Partially correct 75 ms 9620 KB Output is partially correct
6 Partially correct 79 ms 10824 KB Output is partially correct
7 Partially correct 73 ms 10860 KB Output is partially correct
8 Partially correct 76 ms 10696 KB Output is partially correct
9 Partially correct 64 ms 9364 KB Output is partially correct
10 Partially correct 76 ms 10588 KB Output is partially correct
11 Partially correct 77 ms 10488 KB Output is partially correct
12 Partially correct 65 ms 9416 KB Output is partially correct
13 Correct 40 ms 6056 KB Output is correct
14 Partially correct 67 ms 9672 KB Output is partially correct
15 Partially correct 68 ms 9776 KB Output is partially correct
16 Partially correct 2 ms 596 KB Output is partially correct
17 Correct 38 ms 5796 KB Output is correct
18 Correct 38 ms 5832 KB Output is correct
19 Partially correct 66 ms 9444 KB Output is partially correct
20 Partially correct 71 ms 10536 KB Output is partially correct
21 Partially correct 73 ms 10400 KB Output is partially correct
22 Partially correct 71 ms 10532 KB Output is partially correct