Submission #416939

#TimeUsernameProblemLanguageResultExecution timeMemory
416939balbitMechanical Doll (IOI18_doll)C++14
6 / 100
1083 ms21896 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
//#define BALBIT
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define f first
#define s second

#define REP(i,n) for (int i = 0; i<n; ++i)
#define REP1(i,n) for (int i = 1; i<=n; ++i)

#define ALL(x) (x).begin(), (x).end()
#define SZ(x) (int)(x).size()


#ifdef BALBIT
#define bug(...) cerr<<"#"<<__LINE__<<"- "<<#__VA_ARGS__<<": ", _do(__VA_ARGS__)

template<typename T> void _do(T && x) { cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T && x, S &&...y) {cerr<<x<<", "; _do(y...);}
#else
#define bug(...)

#endif // BALBIT

const int maxn = 2e5+5;

vector<int> go[maxn];

int IT = 0; // keep indexes positive until returning

vector<int> X,Y;
vector<int> sw;
bool st[maxn*4];
bool del[maxn*4];
int par[maxn*4];
bool isx[maxn*4];

//int add(int x=0, int y=0) {
//    X.pb(x); Y.pb(y);
//    return ++IT;
//}

const int inf = 1000000000;

int build(int sz, int bk, int lft) {
    bug(sz,bk,lft);
    if(sz == 0) return bk;
    if (lft == 0) {
//        assert(sz == 1);
        return inf;
    }
    int me = ++IT;
    int bg = min(sz,(1<<(lft-1)));
    X[me] = build(sz-bg, bk, lft-1);
    Y[me] = build(bg, bk, lft-1);
    return -me;
}

void create_circuit(int n, std::vector<int> A) {
    bug("HI");
    X.pb(0); Y.pb(0);
    A.pb(0);
    int m = SZ(A);
    REP(i, m-1) {
        go[A[i]].pb(A[i+1]);
    }
    X.resize(n*2+1); Y.resize(n*2+1);
    sw.resize(n+1);
    sw[0] = A[0];
    REP1(i,n) {
        if (SZ(go[i]) == 0) {
            sw[i] = i;
            continue;
        }
        if (SZ(go[i]) == 1) {
            sw[i] = go[i][0];
            continue;
        }
        int dep = 0;
        while ((1<<dep) < SZ(go[i])) ++dep;
        bug(i, SZ(go[i]), dep);
        // build tree
        sw[i] = build(SZ(go[i]), -(IT+1), dep);
//        IT += ((1<<dep)-1);
        bug (i, sw[i]);
        REP(j, SZ(go[i])) {
            int at = -sw[i];
            while (1) {
                int &to = st[at]?Y[at]:X[at];
                bug(at, to);
                st[at] ^= 1;
                if (to == inf) {
                    to = go[i][j];
                    break;
                }else{
                    at = -(to);
                }
            }
        }
        bug("DOnE!");
    }


    X.erase(X.begin()); Y.erase(Y.begin());
    X.resize(IT); Y.resize(IT);
    answer(sw,X,Y);
}


/*
5 9
1 2 1 3 1 4 1 5 1
*/


#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...