# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
899223 | ThylOne | 자동 인형 (IOI18_doll) | C++14 | 0 ms | 436 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "doll.h"
#include<bits/stdc++.h>
#define sz(x) ((int)x.size())
using namespace std;
const int bonus = 4*100000;
const int flag = bonus-1;
struct node{
int id=flag;
int left=flag;
int right=flag;
int x=flag;
int y=flag;
};
vector<node> pool;
vector<int> leafs;
void create_circuit(int M, std::vector<int> A) {
//A.push_back(0);
bool BAB = (__builtin_popcount(sz(A))==1);
if(BAB)A.push_back(flag);
int N = A.size();
pool.resize(2*N);
for(int i = 0;i<sz(pool);i++){
pool[i].id = i;
}
for(int i=0;i<N/2+N%2;i++){
leafs.push_back(i);
}
vector<int> actual = leafs;
int actNode = N/2+N%2;
while(actual.size()>1){
if(actual.size()&1){
actual.push_back(flag);
}
//dbg
vector<int> vec;
for(int i=0;i<sz(actual);i+=2){
pool[actNode].left = actual[i];
pool[actNode].right = actual[i+1];
vec.push_back(actNode);
actNode++;
}
swap(vec,actual);
}
for(int i=sz(leafs);i<sz(pool);i++){
if((pool[i].left==flag)^(pool[i].right==flag)){
if(pool[i].left==flag)
pool[i].left=actNode;
else
pool[i].right=actNode;
actNode++;
}
}
pool.resize(actNode);
int root = actual[0];
//On coupe les branches en trop et on marque ce qu'on sait
bool state[sz(pool)];
fill(state,state+sz(pool),false);
int tot=0;
auto run = [&](){
vector<int> way = {root};
while(way.back()!=flag){
//On flip now le state
if(state[way.back()])tot--;
else tot++;
state[way.back()]=!state[way.back()];
if(!state[way.back()]){
//right
way.push_back(pool[way.back()].right);
}else{
way.push_back(pool[way.back()].left);
}
}
way.pop_back();
return way.back();
};
int cnt=0;
vector<int> last = {-1};
int limit=0;
for(int i=0;i<pool.size();i++){
if(pool[i].left==flag)limit++;
if(pool[i].right==flag)limit++;
}
for(int I=0;I<limit;I++){
int r = run();
if(r<leafs.size() && cnt<N){
if(pool[r].x!=flag){
pool[r].y = A[cnt];
}else{
pool[r].x = A[cnt];
}
//cout<<r<<' '<<A[cnt]<<endl;
cnt++;
}
last.push_back(r);
}
pool[last.back()].y=0;
vector<int> C;
for(int i = 0;i<=M;i++){
C.push_back(-(root+1));
}
vector<int> X,Y;
for(int i=0;i<sz(leafs);i++){
if(pool[i].x==flag)pool[i].x=-1-root;
if(pool[i].y==flag)pool[i].y=-1-root;
X.push_back(pool[i].x);
Y.push_back(pool[i].y);
}
for(int i=sz(leafs);i<sz(pool);i++){
if(pool[i].x==0){
X.push_back(0);
}else if(pool[i].left==flag){
X.push_back(-1-root);
}else{
X.push_back(-1-pool[i].left);
}
if(pool[i].y==0){
Y.push_back(0);
}else if(pool[i].right==flag){
Y.push_back(-1-root);
}else{
Y.push_back(-1-pool[i].right);
}
}
answer(C,X,Y);
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |