Submission #1207672

#TimeUsernameProblemLanguageResultExecution timeMemory
1207672raphaelpMechanical Doll (IOI18_doll)C++20
6 / 100
1096 ms11452 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
int rev(int x, int b)
{
    int ans = 0;
    while (x)
    {
        b--;
        ans *= 2;
        ans += x % 2;
        x /= 2;
    }
    while (b--)
        ans *= 2;
    return ans;
}
void create_circuit(int M, vector<int> A)
{
    int N = A.size();
    vector<vector<int>> exits(M + 1);
    exits[0].push_back(A[0]);
    for (int i = 0; i < N - 1; i++)
        exits[A[i]].push_back(A[i + 1]);
    exits[A.back()].push_back(0);
    vector<int> X, Y, C(M + 1), state;
    for (int i = 0; i <= M; i++)
    {
        int last = X.size();
        int x = exits[i].size();
        if (x == 0)
        {
            C[i] = 0;
            continue;
        }
        C[i] = exits[i][0];
        if (x == 1)
            continue;
        C[i] = -X.size() - 1;
        int y = pow(2, ceil(log2(x)));
        for (int j = 1; j < y; j++)
        {
            X.push_back(M + 1);
            Y.push_back(M + 1);
            state.push_back(0);
            if (2 * i < y)
                X[i] = -(last - 2 * i);
            if (2 * i + 1 < y)
                Y[i] = -(last + 2 * i + 1);
        }
        vector<int> targs(y - x, -last - 1);
        for (int j = 0; j < x; j++)
            targs.push_back(exits[i][j]);
        for (int j = 0; j < y; j++)
        {
            int pos = last;
            while (true)
            {
                state[pos] = 1 - state[pos];
                if (state[pos])
                {
                    if (X[pos] == M + 1)
                    {
                        X[pos] = targs[j];
                        break;
                    }
                    pos = -X[pos] - 1;
                }
                else
                {
                    if (Y[pos] == M + 1)
                    {
                        Y[pos] = targs[j];
                        break;
                    }
                    pos = -Y[pos] - 1;
                }
            }
        }
    }
    answer(C, X, Y);
}
/*int main()
{
    int N, M;
    cin >> N >> M;
    vector<int> Tab(N);
    for (int i = 0; i < N; i++)
        cin >> Tab[i];
    create_circuit(M, Tab);
}*/
#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...