Submission #1060462

#TimeUsernameProblemLanguageResultExecution timeMemory
1060462new_accMechanical Doll (IOI18_doll)C++14
100 / 100
86 ms21676 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
const int N=1e6+10;
int g[N][2],nw[N],val[N];
bool bb[N],usu[N];
void create_circuit(int m, vi a) {
    a.push_back(0); 
    int n=a.size(),w=1;
    while(w<n) w*=2;
    for(int i=1;i<w;i++) g[i][0]=i*2,g[i][1]=i*2+1;
    int kt=n;
    for(int i=1;i<=w;i++){
        int curr=1; 
        while(curr<w){
            bb[curr]^=1;
            curr=g[curr][bb[curr]];
        }
        int xd=2*w-curr;
        g[curr][0]=-1,g[curr][1]=-1;
        if(xd<=n){
            val[curr]=a[--kt];
            usu[curr]=0;
        }else usu[curr]=1,val[curr]=-1;
    }
    for(int i=w-1;i>=1;i--)
        if(usu[i*2] and usu[i*2+1]) usu[i]=1;
    int li=0;
    for(int i=1;i<w;i++){
        if(!usu[i]){
            nw[i]=++li;
        }
    } 
    vi c,x(li),y(li); 
    for(int i=0;i<=m;i++) c.push_back(-1);
    for(int i=1;i<w/2;i++){
        if(usu[i]) continue;
        if(usu[i*2]) x[nw[i]-1]=-1;
        else x[nw[i]-1]=-nw[g[i][0]];
        if(usu[i*2+1]) y[nw[i]-1]=-1;
        else y[nw[i]-1]=-nw[g[i][1]];
    }
    for(int i=w/2;i<w;i++){
        if(usu[i]) continue;
        x[nw[i]-1]=val[g[i][0]];
        y[nw[i]-1]=val[g[i][1]];
    }
    //for(auto u:y) cout<<u<<"\n";
    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...