제출 #1038697

#제출 시각아이디문제언어결과실행 시간메모리
1038697huutuan자동 인형 (IOI18_doll)C++14
100 / 100
143 ms43764 KiB
#include "doll.h"

#include <bits/stdc++.h>

using namespace std;

const int N=1e6+10;
vector<int> g[N];
int n, m, p, a[N];
vector<int> order, X, Y;
int mxdep;

void build(int u, int dep){
   if (p==0){
      g[u]={1, 1};
      X[u]=Y[u]=-1;
      return;
   }
   if (dep==mxdep){
      g[u]={-1, -1};
      p-=2;
      return;
   }
   if (p){
      g[u].push_back(X.size());
      X.push_back(0); Y.push_back(0);
      build(g[u][0], dep+1);
   }else{
      g[u].push_back(1);
   }
   if (p){
      g[u].push_back(X.size());
      X.push_back(0); Y.push_back(0);
      build(g[u][1], dep+1);
   }else{
      g[u].push_back(1);
   }
   swap(g[u][0], g[u][1]);
   X[u]=-g[u][0], Y[u]=-g[u][1];
}

void dfs(int u){
   a[u]^=1;
   int v=g[u][a[u]^1];
   if (v==-1){
      order.push_back(u<<1|(a[u]^1));
      return;
   }
   if (v==1) return;
   dfs(g[u][a[u]^1]);
}

void create_circuit(int M, std::vector<int> A) {
   n=A.size(), m=M;
   vector<int> C(M+1);
   C[0]=A[0];
   for (int i=1; i<=M; ++i) C[i]=-1;
   A.erase(A.begin());
   A.push_back(-1);
   if ((int)A.size()&1) A.push_back(-1);
   A.back()=0;
   n=A.size();
   while ((1<<mxdep)<n) ++mxdep;
   X.resize(2); Y.resize(2);
   p=n;
   build(1, 1);
   for (int i=0; i<(1<<mxdep); ++i){
      dfs(1);
   }
   for (int i=0; i<(int)A.size(); ++i){
      int id=order[i];
      if (id&1) Y[id>>1]=A[i];
      else X[id>>1]=A[i];
   }
   X.erase(X.begin()); Y.erase(Y.begin());
   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...