Submission #713784

#TimeUsernameProblemLanguageResultExecution timeMemory
713784alvingogoMechanical Doll (IOI18_doll)C++14
100 / 100
126 ms13056 KiB
#include <bits/stdc++.h>
#include "doll.h"
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

vector<int> g,x,y;
int nw=0;
vector<pair<int,int> > v;
vector<int> tp;
const int inf=1e9;
int build(int f,int sz){
    queue<int> q;
    q.push(f);
    int cnt=0;
    while(cnt<sz/2-1){
        auto h=q.front();
        q.pop();
        x[h]=f+1;
        y[h]=f+2;
        q.push(f+1);
        q.push(f+2);
        f+=2;
        cnt++;
    }
    return f+1;
}
void go(int z){
    int root=0;
    while(1){
        if(tp[root]==0){
            tp[root]=1;
            if(x[root]==-1){
                x[root]=inf+z;
                break;
            }
            root=x[root];
        }
        else{
            tp[root]=0;
            if(y[root]==-1){
                y[root]=inf+z;
                break;
            }
            root=y[root];
        }
    }
}
void create_circuit(int m, vector<int> a) {
    a.push_back(0);
    int n=a.size();
    if(n==2){
        vector<int> d,e,f;
        d.resize(m+1,0);
        d[0]=a[0];
        answer(d,e,f);
        return;
    }
    g.clear();
    g.resize(m+1,-1);
    int root=0;
    x.resize(400000,-1);
    y.resize(400000,-1);
    tp.resize(400000,0);
    int flag=0;
    for(int i=(1<<19);i>1;i>>=1){
        if(n>=i){
            flag=1;
            n-=i;
            int c=root+1;
            y[root]=c;
            int u=build(c,i);
            if(n==0){
                x[root]=0;
                root=u-1;
                break;
            }
            x[root]=u;
            root=u;
        }
        else{
            if(!flag || !n){
                continue;
            }
            x[root]=0;
            y[root]=root+1;
            root++;
        }
    }
    if(n%2){
        x[root]=0;
    }
    x.resize(root+1);
    y.resize(root+1);
    n=a.size();
    for(int i=0;i<n;i++){
        go(a[i]);
    }
    for(int i=0;i<=root;i++){
        if(x[i]>=inf){
            x[i]-=inf;
        }
        else{
            x[i]=-1-(x[i]);
        }
        if(y[i]>=inf){
            y[i]-=inf;
        }
        else{
            y[i]=-1-(y[i]);
        }
    }
    answer(g,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...