Submission #1336617

#TimeUsernameProblemLanguageResultExecution timeMemory
1336617DeltaStruct자동 인형 (IOI18_doll)C++20
84 / 100
69 ms9808 KiB
#include <bits/stdc++.h>
using namespace std;
#include "doll.h"

void create_circuit(int m,vector<int> A){
  int n = A.size(); --n;
  vector<int> C(m+1,-1); C[0] = A[0];
  A.erase(A.begin());
  int s = 0;
  while((1<<s) <= n) ++s;
  vector<int> X,Y;
  for (int i(s-1),k(-s-1);i > -1;--i){
    if (i==0) X.emplace_back((n&1?-998244353:-1)),Y.emplace_back(0);
    else X.emplace_back(((n>>i)&1?exchange(k,k-(1<<i)+1):-1)),Y.emplace_back(-Y.size()-2);
  }
  vector<vector<int>> Z(s);
  for (int i(0),k(0);i < (1<<s);++i){
    for (int j(0);j < s;++j) if ((i>>j)%2==0){
      if (X[j]<-1) Z[j].emplace_back(k++);
      break;
    }
  }
  if (n&1) X[s-1] = A[Z[s-1][0]],Z[s-1].clear();
  for (int i(0);i < s;++i) if (!Z[i].empty()){
    queue<vector<int>> que; que.emplace(Z[i]);
    while(!que.empty()){
      vector<int> B = que.front(); que.pop();
      if (B.size()&1){
        if (X[B.back()]==0) X[B.back()] = -X.size()-1;
        else Y[B.back()] = -X.size()-1;
        B.pop_back();
      }
      X.emplace_back(0),Y.emplace_back(0);
      if (B.size()==2){
        X.back() = A[B[0]],Y.back() = A[B[1]];
        continue;
      }
      vector<int> D,E;
      for (int k(0);k < (int)B.size();++k) (k&1?E:D).emplace_back(B[k]);
      D.emplace_back(X.size()-1),E.emplace_back(X.size()-1);
      que.emplace(D),que.emplace(E);
    }
  }
  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...