Submission #1322394

#TimeUsernameProblemLanguageResultExecution timeMemory
1322394kasamchiMechanical Doll (IOI18_doll)C++20
53 / 100
58 ms13956 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

void create_circuit(int M, vector<int> A) {
    int N = A.size();
    A.push_back(0);

    vector<int> C(M + 1);
    vector<int> X, Y;

    vector<vector<int>> edge(M + 1);
    for (int i = 0; i < N; i++) {
        edge[A[i]].push_back(A[i + 1]);
    }

    C[0] = A[0];
    for (int m = 1; m <= M; m++) {
        if (edge[m].empty()) {}
        else if (edge[m].size() == 1) {
            C[m] = edge[m][0];
        }
        else {
            int L = edge[m].size();
            int b = 32 - __builtin_clz(L - 1);
            int K = (1 << b);
            
            C[m] = -X.size() - 1;
            int xsz = X.size();
            for (int i = 0; i < K / 2 - 1; i++) {
                X.push_back(-xsz - (i + 1) * 2);
                Y.push_back(-xsz - (i + 1) * 2 - 1);
            }
            for (int i = K / 2 - 1; i < K - 1; i++) {
                X.push_back(C[m]);
                Y.push_back(C[m]);
            }

            vector<int> v;
            for (int i = 0; i < K; i++) {
                bitset<32> bs(i);
                for (int j = 0; j < b / 2; j++) {
                    bool t = bs[j];
                    bs[j] = bs[b - j - 1];
                    bs[b - j - 1] = t;
                }
                v.push_back(bs.to_ulong());
            }

            vector<int> u(K);
            for (int i = 0; i < K; i++) {
                u[v[i]] = i;
            }

            for (int i = 0; i < K / 2; i++) {
                X[xsz + K / 2 - 1 + u[i] / 2] = edge[m][i];
            }
            for (int i = K / 2; i < K; i++) {
                if (i >= L - 1) {
                    Y[xsz + K / 2 - 1 + u[i] / 2] = -xsz - 1;
                } else {
                    Y[xsz + K / 2 - 1 + u[i] / 2] = edge[m][i];
                }
            }
            Y.back() = edge[m][L - 1];
        }
    }
    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...