Submission #1038638

#TimeUsernameProblemLanguageResultExecution timeMemory
1038638huutuanMechanical Doll (IOI18_doll)C++14
6 / 100
48 ms22028 KiB
#include "doll.h"

#include <bits/stdc++.h>

using namespace std;

const int N=3e5+10;
vector<int> g[N];
int n, m;

void create_circuit(int M, std::vector<int> A) {
   n=A.size(), m=M;
   for (int i=1; i<n; ++i) g[A[i-1]].push_back(A[i]);
   g[0].push_back(A[0]);
   g[A[n-1]].push_back(0);
   for (int i=0; i<=m; ++i) if (g[i].size()){
      int pw=1;
      while ((int)g[i].size()%(pw*2)==0) pw*=2;
      bool check=1;
      for (int j=0; j<(int)g[i].size(); ++j) check&=g[i][j]==g[i][j%pw];
      assert(check);
      g[i].resize(pw);
   }
   int cur=0;
   vector<int> C(M+1), X, Y;
   for (int i=0; i<=m; ++i) if ((int)g[i].size()){
      if ((int)g[i].size()==1){
         C[i]=g[i][0];
         continue;
      }
      cur=X.size();
      C[i]=-cur-1;
      X.resize((int)X.size()+(int)g[i].size()-1);
      Y.resize((int)Y.size()+(int)g[i].size()-1);
      auto build=[&](auto &&self, int id){
         if ((id<<1)>=(int)g[i].size()){
            X[cur+id-1]=g[i][(id<<1)-(int)g[i].size()];
            Y[cur+id-1]=g[i][(id<<1|1)-(int)g[i].size()];
            return;
         }
         X[cur+id-1]=-cur-(id<<1);
         Y[cur+id-1]=-cur-(id<<1|1);
         self(self, id<<1);
         self(self, id<<1|1);
      };
      build(build, 1);
   }
   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...