This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "doll.h"
#include <queue>
using namespace std;
void create_circuit(int m, vector<int> a) {
int n = a.size();
vector<vector<int>> to(m+1);
to[0].push_back(a[0]);
for (int i = 0; i < n-1; ++i){
to[a[i]].push_back(a[i+1]);
}
to[a[n-1]].push_back(0);
vector<int> x, y;
vector<bool> state;
int cur = -1;
vector<int> c(m+1);
for (int i = 0; i <= m; ++i){
int k = 0, b = 1;
while (to[i].size() > b) b *= 2, k++;
if (k == 0){
if (to[i].empty()) c[i] = 0;
else c[i] = to[i][0];
continue;
}
int src = cur;
int mx = cur - b + 2;
c[i] = cur--;
queue<int> q;
q.push(cur+1);
while (!q.empty()){
state.push_back(true);
int p = q.front();
q.pop();
if (cur < mx) {
x.push_back(0);
y.push_back(0);
continue;
}
x.push_back(cur--);
y.push_back(cur--);
q.push(x.back());
q.push(y.back());
}
int rem = b - (int)to[i].size();
for (int j = 0; j < to[i].size() - rem; ++j){
int pos = src;
for (int l = 0; l < k-1; ++l) {
if (state[-pos-1]) {
state[-pos-1] = false;
pos = x[-pos-1];
} else{
state[-pos-1] = true;
pos = y[-pos-1];
}
}
if (state[-pos-1]) {
state[-pos-1] = false;
x[-pos-1] = to[i][j];
} else{
state[-pos-1] = true;
y[-pos-1] = to[i][j];
}
}
for (int j = (int)to[i].size() - rem; j < to[i].size(); ++j){
int pos = src;
for (int l = 0; l < k-1; ++l) {
if (state[-pos-1]) {
state[-pos-1] = false;
pos = x[-pos-1];
} else{
state[-pos-1] = true;
pos = y[-pos-1];
}
}
if (state[-pos-1]) {
state[-pos-1] = false;
x[-pos-1] = src;
} else{
state[-pos-1] = true;
y[-pos-1] = src;
}
pos = src;
for (int l = 0; l < k-1; ++l) {
if (state[-pos-1]) {
state[-pos-1] = false;
pos = x[-pos-1];
} else{
state[-pos-1] = true;
pos = y[-pos-1];
}
}
if (state[-pos-1]) {
state[-pos-1] = false;
x[-pos-1] = to[i][j];
} else{
state[-pos-1] = true;
y[-pos-1] = to[i][j];
}
}
}
while (true){
vector<int> pr(-cur), tp(-cur);
for (int i = cur + 1; i <= m; ++i){
if (i < 0) {
if (x[-i-1] < 0) pr[-x[-i-1]-1] = i, tp[-x[-i-1]-1] = 1;
if (y[-i-1] < 0) pr[-y[-i-1]-1] = i, tp[-y[-i-1]-1] = 2;
} else{
if (c[i] < 0) pr[-c[i]-1] = i, tp[-c[i]-1] = 3;
}
}
vector<bool> del(-cur);
bool flag = false;
for (int i = -1; i > cur; --i){
if (x[-i-1] != y[-i-1]) continue;
if (tp[-i-1] == 1) x[-pr[-i-1]-1] = x[-i-1];
else if (tp[-i-1] == 2) y[-pr[-i-1]-1] = y[-i-1];
else c[pr[-i-1]] = x[-i-1];
del[-i-1] = true;
flag = true;
}
if (!flag) break;
vector<int> nname(-cur);
int ncur = -1;
for (int i = -1; i > cur; --i){
if (del[-i-1]) continue;
nname[-i-1] = ncur--;
}
vector<int> xx(-ncur), yy(-ncur);
for (int i = -1; i > cur; --i){
if (del[-i-1]) continue;
if (x[-i-1] > 0) xx[-nname[-i-1]-1] = x[-i-1];
else xx[-nname[-i-1]-1] = nname[-x[-i-1]-1];
if (y[-i-1] > 0) yy[-nname[-i-1]-1] = y[-i-1];
else yy[-nname[-i-1]-1] = nname[-y[-i-1]-1];
}
for (int i = 0; i <= m; ++i){
if (c[i] > 0) continue;
c[i] = nname[-c[i]-1];
}
x = xx, y = yy;
cur = ncur;
}
answer(c, x, y);
}
Compilation message (stderr)
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:23:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
23 | while (to[i].size() > b) b *= 2, k++;
| ~~~~~~~~~~~~~^~~
doll.cpp:39:17: warning: unused variable 'p' [-Wunused-variable]
39 | int p = q.front();
| ^
doll.cpp:53:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
53 | for (int j = 0; j < to[i].size() - rem; ++j){
| ~~^~~~~~~~~~~~~~~~~~~~
doll.cpp:73:49: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
73 | for (int j = (int)to[i].size() - rem; j < to[i].size(); ++j){
| ~~^~~~~~~~~~~~~~
# | 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... |