Submission #1237454

#TimeUsernameProblemLanguageResultExecution timeMemory
1237454noyancanturkMechanical Doll (IOI18_doll)C++20
53 / 100
161 ms75572 KiB
#include "doll.h"

#include<bits/stdc++.h>
using namespace std;

#define pb push_back

using pii=pair<int,int>;

const int lim=2e6+100;

vector<int>going[lim];
vector<int>x(lim,INT_MAX),y(lim,INT_MAX);

int last=0;

int build(vector<pii>need,int root){
  if(need.size()==1){
    if(need[0].second!=INT_MIN){
      return need[0].second;
    }
    return root;
  }
  int ind=last++;
  if(root==1)root=-ind-1;
  vector<pii>ok0,ok1;
  for(auto[xx,yy]:need){
    if((xx)&1)ok1.pb({xx/2,yy});
    else ok0.pb({xx/2,yy});
  }
  x[ind]=build(ok0,root);
  y[ind]=build(ok1,root);
  return -ind-1;
}

void create_circuit(int m,vector<int>a){
  int n=a.size();
  for(int i=0;i<n;i++){
    if(i!=n-1){
      going[a[i]].pb(a[i+1]);
    }else{
      going[a[i]].pb(0);
    }
  }
  vector<int>c(m+1);
  c[0]=a[0];
  for(int i=1;i<=m;i++){
    if(!going[i].size())continue;
    vector<pii>need;
    for(int j=0;j<going[i].size();j++){
      need.pb({j,going[i][j]});
    }
    while(__builtin_popcount(need.size())!=1){
      need.pb({INT_MIN,INT_MIN});
    }
    sort(need.begin(),need.end());
    for(int j=0;j<need.size();j++){
      need[j].first=j;
    }
    c[i]=build(need,1);
  }
  while(x.back()==INT_MAX){
    x.pop_back();
    y.pop_back();
  }
  answer(c,x,y);
}

// void create_circuit(int M, std::vector<int> A) {
//   int N = A.size();
//   std::vector<int> C(M + 1);
//   C[0] = -1;
//   for (int i = 1; i <= M; ++i) {
//     C[i] = 1;
//   }
//   std::vector<int> X(N), Y(N);
//   for (int k = 0; k < N; ++k) {
//     X[k] = Y[k] = A[k];
//   }
//   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...