제출 #978130

#제출 시각아이디문제언어결과실행 시간메모리
978130FEDIKUS자동 인형 (IOI18_doll)C++17
100 / 100
159 ms23988 KiB
#include "doll.h"
#include<bits/stdc++.h>

using namespace std;

vector<pair<int,int> > s;
vector<int> a;
int n;
int step;
vector<int> posetio;

int klk=1;
int resi(int l,int r,int br=0,int bit=0){
  if(l>n) return -1;
  if(l==r){
    posetio.push_back(br);
    return br;
  }
  
  int ja=-klk;
  klk++;
  s.push_back({-1,-1});
  
  int mid=l+(r-l)/2;
  int levi=resi(l,mid,br+(1<<bit),bit+1);
  int desni=resi(mid+1,r,br,bit+1);
  s[-ja-1]={desni,levi};

  return ja;
}

void create_circuit(int m, vector<int> _a) {
  a=_a;
  n=a.size();
  step=1;
  while(step<n+1) step*=2;
  int c=resi(0,step-1);
  vector<int> cc(m+1,c);
  vector<int> x(s.size()),y(s.size());
  sort(posetio.begin(),posetio.end());
  assert(int(posetio.size())==n+1);
  map<int,int> kurac;
  for(int i=0;i<n+1;i++){
    if(i==n) kurac[posetio[i]]=0;
    else kurac[posetio[i]]=a[i];
  }
  for(int i=0;i<int(s.size());i++){
    if(s[i].first<0) x[i]=s[i].first;
    else x[i]=kurac[s[i].first];
    if(s[i].second<0) y[i]=s[i].second;
    else y[i]=kurac[s[i].second];
  }
  answer(cc,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...