제출 #1199659

#제출 시각아이디문제언어결과실행 시간메모리
1199659qs1자동 인형 (IOI18_doll)C++20
16 / 100
47 ms11320 KiB
#include "doll.h"
#include<bits/stdc++.h>
using namespace std;
#define lli int


lli invert(lli i,lli n){//indexed in 0
  lli r=0;
  while(n>1){
    r*=2;
    r+=i%2;
    n/=2;
    i/=2;
  }
  return r;
}


void create_circuit(int y, vector<int> l) {
  y++;
  int x = l.size();
  lli ai=-1,s,n,lst;
  l.push_back(0);
  vector<lli> vx, vy,r(y);
  vector<vector<lli>>va(y);
  for(lli i=0;i<x;i++){
    va[l[i]].push_back(l[i+1]);
  }
  r[0]=l[0];
  for(lli i=1;i<y;i++){
    if(va[i].size()==0)r[i]=0;
    else if(va[i].size()==1)r[i]=va[i][0];
    else if(va[i].size()==2){
      r[i]=ai;
      ai--;
      vx.push_back(va[i][0]);
      vy.push_back(va[i][1]);
    }
    else{
      lli n=1;
      r[i]=ai;
      vx.push_back(ai-1);
      vy.push_back(ai-2);
      ai--;
      while(n*2<va[i].size()){
        if(n!=1){
          for(lli i=0;i<n;i++){
            vx.push_back(ai-2*i-n);
            vy.push_back(ai-2*i-n-1);
          }
          ai-=n;
        }
        n*=2;
      }
      lst=va[i][va[i].size()-1];
      for(lli ii=0;ii<2*n-1;ii++){
        s=invert(ii,n*2);
        if(ii%2){
          if(s>=va[i].size()-1)vy.push_back(ai+n/2-ii/2);
          else vy.push_back(va[i][s]);
        }
        else{
          if(s>=va[i].size()-1)vx.push_back(ai+n/2-ii/2);
          else vx.push_back(va[i][s]);
        }
      }
      vy.push_back(lst);
      ai-=n;
    }
  }
  answer(r, vx, vy);
}
#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...