제출 #410045

#제출 시각아이디문제언어결과실행 시간메모리
410045ruadhan자동 인형 (IOI18_doll)C++17
53 / 100
321 ms15868 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;
#define sz(x) (int)x.size()

// void answer(vector<int> &C, vector<int> tmp1, vector<int> tmp2)
// {
//     for (auto &x : C)
//         cout << x << " ";
//     cout << '\n';
//     for (auto x : tmp1)
//         cout << x << " ";
//     cout << '\n';
//     for (auto x : tmp2)
//         cout << x << " ";
//     cout << '\n';
// }

int S;
vector<int> X, Y;
void build(int node, int mx_node)
{
    if (node == 1)
        X.resize(sz(X) + mx_node - 1, -S - node), Y.resize(sz(Y) + mx_node - 1, -S - node);
    if (node * 2 >= mx_node)
        return;
    X[S + node - 1] = -S - node * 2;
    Y[S + node - 1] = -S - node * 2 - 1;
    build(2 * node, mx_node), build(2 * node + 1, mx_node);
}

void create_circuit(int M, vector<int> A)
{
    int N = A.size();
    vector<int> C(M + 1);
    C[0] = A[0];

    vector<int> make_switches;
    set<int> seen;

    vector<int> adj[M + 1];
    adj[0].push_back(A[0]);
    for (int i = 0; i < N; i++)
    {
        if (i < N - 1)
            adj[A[i]].push_back(A[i + 1]);
        else
            adj[A[i]].push_back(0);

        if (adj[A[i]].size() == 1)
            C[A[i]] = adj[A[i]][0];
        else if (seen.find(A[i]) == seen.end())
        {
            make_switches.push_back(A[i]);
            seen.insert(A[i]);
        }
    }

    int sz_switches = make_switches.size();
    // for (auto x : make_switches)
    //     cout << x << " ";
    // cout << '\n';
    X.reserve(200005), Y.reserve(200005);
    S = 0;
    for (int i = 0; i < sz_switches; i++)
    {
        int root_trigger = make_switches[i];
        int root_switch = -S - 1;
        C[root_trigger] = root_switch;
        int K = sz(adj[root_trigger]);
        int log2;
        for (int i = 0; i < 32; i++)
            if ((1 << i) >= K)
            {
                log2 = i;
                break;
            }
        build(1, 1 << log2);

        auto leaves = adj[root_trigger];
        reverse(leaves.begin(), leaves.end());
        leaves.resize(1 << log2, root_switch);
        reverse(leaves.begin(), leaves.end());

        for (int i = 0; i < sz(leaves); i++)
        {
            // int mask = sz(leaves) - i - 1;
            int mask = i;
            int dest_node = 0;
            for (int j = 0; j < log2; j++)
                if ((mask >> j) & 1)
                    dest_node += 1 << (log2 - j - 1);
            dest_node += (1 << log2);
            int parent = (dest_node) / 2;
            if (2 * parent == dest_node)
                X[S + parent - 1] = leaves[i];
            else
                Y[S + parent - 1] = leaves[i];
            // cout << "dest_node = " << dest_node << ", parent = " << parent << '\n';
            // cout << "S = " << S << ", S + parent + 1 = " << S + parent + 1 << '\n';
        }

        S += (1 << log2) - 1;
    }
    answer(C, X, Y);
}

// int main()
// {
//     vector<int> A = {1, 2, 1, 2, 1, 2, 1};
//     int M = 2;
//     create_circuit(M, A);
//     return 0;
// }

컴파일 시 표준 에러 (stderr) 메시지

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:78:14: warning: 'log2' may be used uninitialized in this function [-Wmaybe-uninitialized]
   78 |         build(1, 1 << log2);
      |         ~~~~~^~~~~~~~~~~~~~
#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...