Submission #1368740

#TimeUsernameProblemLanguageResultExecution timeMemory
1368740marizaMechanical Doll (IOI18_doll)C++20
100 / 100
48 ms7876 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll INF=1e9;

void create_circuit(int m, vector<int> a){
    ll n=a.size();

    vector<int> s[2];

    ll k=0;
    while((1ll<<k)<=n) k++;

    for(ll i=k-1; i>=0; i--){
        ll sn=s[0].size()+1;

        if(i==0) s[1].push_back(0);
        else if((1ll<<i)&n) s[1].push_back(-(sn+(1ll<<i)));
        else s[1].push_back(-(sn+1));

        if((1ll<<i)&n){
            if(i==0){
                s[0].push_back(INF);
                continue;
            }

            s[0].push_back(-(sn+1));
            for(ll j=1; j<(1ll<<i)/2; j++){
                s[0].push_back(-(sn+2*j));
                s[1].push_back(-(sn+2*j+1));
            }
            for(ll j=(1ll<<i)/2; j<(1ll<<i); j++){
                s[0].push_back(INF);
                s[1].push_back(INF);
            }
        }
        else{
            s[0].push_back(-1);
        }
    }

    // JUST FOR TESTING
    // vector<int> c(m+1,-1);
    // answer(c,s[0],s[1]);

    bool x[s[0].size()]={};
    for(ll i=0; i<n; i++){
        // cout<<i<<endl;
        ll curr=-1;
        while(s[x[-curr-1]][-curr-1]!=INF){
            // cout<<curr<<" "<<x[-curr-1]<<" "<<s[x[-curr-1]][-curr-1]<<endl;
            x[-curr-1]=!x[-curr-1];
            // cout<<x[-curr-1]<<endl;
            if(x[-curr-1]==0) curr=s[1][-curr-1];
            else curr=s[0][-curr-1];
            // cout<<curr<<" "<<x[-curr-1]<<endl;
        }

        if(x[-curr-1]==0) s[0][-curr-1]=a[i];
        else s[1][-curr-1]=a[i];
        x[-curr-1]=!x[-curr-1];
    }

    vector<int> c(m+1,-1);
    answer(c,s[0],s[1]);
}
#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...