Submission #759122

#TimeUsernameProblemLanguageResultExecution timeMemory
759122alexander707070Mechanical Doll (IOI18_doll)C++14
37 / 100
100 ms38544 KiB
#include<bits/stdc++.h> #include "doll.h" #define MAXN 800007 using namespace std; int m,power,n,sz,curr,root; int a[MAXN],s; int lt[MAXN],rt[MAXN]; vector<int> from,to,c,w[MAXN]; int rev(int x){ int res=0; for(int i=1;i<power;i*=2){ res*=2; res+=x%2; x/=2; } return res; } void build(int v,int l,int r,int num,int id){ if(l+1==r){ num*=2; if(rev(num)<sz-1)lt[v]=w[id][rev(num)]; else if(rev(num)==power-1)lt[v]=w[id].back(); else lt[v]=-root; num++; if(rev(num)<sz-1)rt[v]=w[id][rev(num)]; else if(rev(num)==power-1)rt[v]=w[id].back(); else rt[v]=-root; }else{ int tt=(l+r)/2; curr++; lt[v]=-curr; build(curr,l,tt,2*num,id); curr++; rt[v]=-curr; build(curr,tt+1,r,2*num+1,id); } } void create_circuit(int M, vector<int> A){ m=M; n=int(A.size()); for(int i=0;i<n;i++){ a[i]=A[i]; } for(int i=0;i<n;i++){ w[a[i]].push_back(a[i+1]); } for(int i=0;i<=m;i++)c.push_back(-1); c[0]=a[0]; for(int i=1;i<=m;i++){ if(w[i].empty())continue; if(w[i].size()==1){ c[i]=w[i][0]; continue; } sz=w[i].size(); power=1; while(power<sz)power*=2; curr++; root=curr; c[i]=-root; build(curr,0,power-1,0,i); } for(int i=1;i<=curr;i++){ from.push_back(lt[i]); to.push_back(rt[i]); } answer(c,from,to); } /* int main(){ create_circuit(4, {1,2,1,3}); } */
#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...