이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
void create_circuit(int m, vector<int> a) {
int n = a.size();
int len = 0;
int cnt = -2;
while((1<<len) < n + 1)len++;
vector <int> c(m + 1);
vector <int> x((1<<len) - 1);
vector <int> y((1<<len) - 1);
vector <int> x2;
vector <int> y2;
vector <array<int,3>> ord;
for(int i = 0;i < m + 1;i++){
c[i] = -1;
}
auto dfs = [&](auto self,int node,int d) -> void {
if(d == len - 1){
x[-node - 1] = -1;
y[-node - 1] = -1;
}else{
x[-node - 1] = cnt--;
self(self,cnt + 1,d + 1);
y[-node - 1] = cnt--;
self(self,cnt + 1,d + 1);
}
};
int cnt2 = 0,last = 0;
auto dfs2 = [&](auto self,int node,int d) -> void {
if(d == len - 1){
int nr = 0;
for(int j = 0;j < len;j++){
if(cnt2>>j&1){
nr|=(1<<(len - j - 1));
}
}
if(cnt2 + n >= (1<<len) - 1 && cnt2 != (1<<len) - 1)ord.push_back({nr,node,0});
cnt2++;
if(cnt2 + n >= (1<<len) - 1 && cnt2 != (1<<len) - 1)ord.push_back({nr + (1<<len),node,1});
cnt2++;
last = node;
}else{
self(self,-x[node] - 1,d + 1);
self(self,-y[node] - 1,d + 1);
}
};
auto dfs3 = [&](auto self,int node,int d) -> int {
if(d == len - 1){
if(x[node] == -1 && y[node] == -1){
return -1;
}else{
x2.push_back(x[node]);
y2.push_back(y[node]);
return x2.size() - 1;
}
}else{
if(node == 0){
x2.push_back(0);
y2.push_back(0);
}
int l = self(self,-x[node] - 1,d + 1);
int r = self(self,-y[node] - 1,d + 1);
if(l == -1 && r == -1)return -1;
else{
if(node == 0){
if(l != -1){
x2[0] = -l - 1;
}else x2[0] = -1;
if(r != -1){
y2[0] = -r - 1;
}else y2[0] = -1;
}else{
if(l != -1){
x2.push_back(-l - 1);
}else x2.push_back(-1);
if(r != -1){
y2.push_back(-r - 1);
}else y2.push_back(-1);
}
return x2.size() - 1;
}
}
};
dfs(dfs,-1,0);
dfs2(dfs2,0,0);
int cnt3 = 0;
sort(ord.begin(),ord.end());
for(auto i:ord){
//cout<<i[0]<<' '<<i[1]<<' '<<i[2]<<'\n';
if(i[2] == 0){
x[i[1]] = a[cnt3];
}else{
y[i[1]] = a[cnt3];
}
cnt3++;
}
y[last] = 0;
/*for(int i = 0;i < (1<<len) - 1;i++){
cout<<x[i]<<' '<<y[i]<<'\n';
}*/
dfs3(dfs3,0,0);
/*for(int i = 0;i < x2.size();i++){
cout<<x2[i]<<' '<<y2[i]<<'\n';
}*/
return answer(c,x2,y2);
}
/**
7 7
1 2 3 4 5 6 7
**/
# | 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... |