Submission #1207652

#TimeUsernameProblemLanguageResultExecution timeMemory
1207652raphaelpMechanical Doll (IOI18_doll)C++20
2 / 100
22 ms7752 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
int rev(int x)
{
    int ans = 0;
    while (x)
    {
        ans *= 2;
        ans += x % 2;
        x /= 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);
    for (int i = 0; i <= M; i++)
    {
        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;
        for (int j = 0; j < x - 1; j++)
        {
            int pos = j - pow(2, floor(log2(j + 1)) - 1) + 1;
            int a = rev(pos), b = rev(2 * pos + 1), a2 = rev(4 * pos + 1), b2 = rev(4 * pos + 3);
            if (a2 <= x)
            {
                X[j] = -X.size() - 1;
                X.push_back(M + 1);
                Y.push_back(M + 1);
            }
            else
                X[j] = exits[i][a - 1];
            if (b2 <= x)
            {
                Y[j] = -X.size() - 1;
                X.push_back(M + 1);
                Y.push_back(M + 1);
            }
            else
                Y[j] = exits[i][b - 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...