Submission #1357617

#TimeUsernameProblemLanguageResultExecution timeMemory
1357617settopMechanical Doll (IOI18_doll)C++20
28 / 100
50 ms10156 KiB
#include "doll.h"
#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define sz(x) (int) x.size()
#define pb push_back
#define all(x) x.begin(),x.end()
const int MAXN=5e5+10;
const ll inf=1e17;
typedef pair<int,int> pii;

int n,X[MAXN],Y[MAXN],cur=1,vis[MAXN],msb,inter;
vector<int> arr;

void buildfull(int ind,int quan){
  if(quan==1) X[ind]=-1;
  
  if(quan<=2)return;
  cur++;
  X[ind]=-cur;
  cur++;
  Y[ind]=-cur;
  buildfull(-X[ind],quan>>1);
  buildfull(-Y[ind],quan>>1);
}

void build(int bit,int ind){
  if(bit==msb){
    if(bit!=0){
      cur++;
      X[ind]=-cur;
      buildfull(cur,(1<<(bit-1)));
      cur++;
      Y[ind]=-cur;
      buildfull(cur,(1<<(bit-1)));
    }
    else X[ind]=-1;
    return;
  }
  cur++;
  X[ind]=-cur;
  build(bit-1,cur);
  if(n&(1<<bit)){
    cur++;
    Y[ind]=-cur;
    buildfull(cur,(1<<bit));
  }
  else Y[ind]=-1;
  return;
}

void get_path(int x){
  //cout<<x<<" ";
  //inter++;
  //if(inter==10)return;
  if(x==0) return;
  if(x>0){
    get_path(-1);
    return;
  }
  vis[-x]++;
  if(vis[-x]==1 && X[-x]==0){
    cur++;
    X[-x]=arr[cur];
  }
  else if(vis[-x]==2 && Y[-x]==0){
    cur++;
    if(cur>=sz(arr)) Y[-x]=0;
    else Y[-x]=arr[cur];
  }
  if(vis[-x]%2==1) get_path(X[-x]);
  else get_path(Y[-x]);
}

void create_circuit(int M, std::vector<int> A){
  n=sz(A)+1;
  arr=A;
  rfall(i,20,0)if(n&(1<<i)) msb=i;
  rfall(i,20,0){
    if(n&(1<<i)){
      build(i,1);
      break;
    }
  }
  vector<int> pos(M+1,-1),y(cur),x(cur);
  int tam=cur;
  cur=-1;
  get_path(-1);
  //cout<<"\n";
  fall(i,0,tam-1) x[i]=X[i+1],y[i]=Y[i+1];
  //fall(i,1,tam) cout<<X[i]<<" "<<Y[i]<<"\n";
  answer(pos,x,y);
}

/*int main(){
  int M,N; cin>>M>>N;
  vector<int> A(N);
  for(auto&u:A)cin>>u;
  create_circuit(M,A);
}*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...