#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(x) (int)x.size()
#define ALL(x) begin(x), end(x)
#define loop(n, i) for (int i = 0; i < n; i++)
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
void create_circuit(int M, vi A)
{
vvi trees(19);
int cnt = 2;
for (int i = 1; i <= 18; i++)
{
// cnt - 1 switches indexed 1 .. cnt-1
vb x(cnt);
while (sz(trees[i]) < cnt)
{
int j = 1;
while (j < cnt)
{
x[j].flip();
if (!x[j])
j = 2 * j + 1;
else
j *= 2;
}
trees[i].pb(j - cnt);
}
cnt *= 2;
}
int N = A.size();
A.pb(0);
vvi occ(M + 1);
loop(sz(A), ix)
{
occ[A[ix]].pb(A[ix + 1]);
}
vi C(M + 1, -1);
C[0] = A[0];
int S = 0;
vi X, Y;
vi curOcc(M + 1);
loop(N, i)
{
if (sz(occ[A[i]]) == 1)
{
C[A[i]] = A[i + 1];
}
else
{
if (curOcc[A[i]] == 0)
{
int pow = 1;
int cnt = 2;
while (cnt < sz(occ[A[i]]))
{
pow++;
cnt *= 2;
}
if (cnt > 2)
throw;
int ix = curOcc[A[i]];
int startIx = S;
S += cnt - 1;
loop(cnt - 1, i)
{
X.pb({});
Y.pb({});
}
for (int i = 1; i <= cnt; i++)
{
int l = 2 * i, r = 2 * i + 1;
if (l >= cnt)
{
X[startIx + (i - 1)] = occ[A[i]][trees[pow][l - cnt]];
Y[startIx + (i - 1)] = occ[A[i]][trees[pow][r - cnt]];
}
else
{
X[startIx + (i - 1)] = -(startIx + (l - 1));
Y[startIx + (i - 1)] = -(startIx + (r - 1));
}
}
}
}
curOcc[A[i]]++;
}
for (int &i : C)
if (i == -1 && S == 0)
i = 0;
answer(C, X, Y);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |