Submission #1199846

#TimeUsernameProblemLanguageResultExecution timeMemory
1199846ByeWorldMechanical Doll (IOI18_doll)C++20
100 / 100
87 ms16784 KiB
#include "doll.h"
#include <bits/stdc++.h>
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<pii,ll> ipii;
const int MAXN = 8e5+15;
const int SQRT = 560;
const int INF = 1e9+10;
const int MOD = 998244353;
const int LOG = 20;

int n, m;
int a[MAXN], x[MAXN], y[MAXN], use[MAXN];
vector<int> C, X, Y;
int lg, node, num;

void dfs(int id, int dep){
    if(dep == lg){
        node++;
        if(node > num-n) use[id] = 1;
        else use[id] = 0;
        return;
    }
    dfs(lf, dep+1); dfs(rg, dep+1);
    use[id] = use[lf]+use[rg];
}
void trav(int id, int dep){
    if(dep+1 == lg){
        if(use[lf]) x[id] = lf; 
        else x[id] = -1;
        if(use[rg]) y[id] = rg;
        else y[id] = -1;
        return;
    }
    if(!use[lf] && !use[rg]) return;
    if(use[lf]) trav(lf, dep+1), x[id] = lf; 
    else x[id] = -1;
    if(use[rg]) trav(rg, dep+1), y[id] = rg;
    else y[id] = -1;
}

int name[MAXN], las[MAXN];
bool ty[MAXN];
int idx, tim;
int ansx[MAXN], ansy[MAXN];

void bd(int nw, int dep){
    if(dep == lg) return;
    ++tim;
    name[nw] = tim;

    if(x[nw] != -1){
        bd(x[nw], dep+1);
        ansx[name[nw]] = name[x[nw]];
    } else ansx[name[nw]] = -1;

    if(y[nw] != -1){
        bd(y[nw], dep+1);
        ansy[name[nw]] = name[y[nw]];
    } else ansy[name[nw]] = -1;
}
void move(int nw, int dep, int mask){
    if(nw == -1){
        int bit = lg-dep;
        for(int i=0; i<(1<<bit); i++)
            las[mask + (i<<dep)] = -1;
        return;
    }
    if(dep == lg){ // nw -> mask
        las[mask] = nw;
        return;
        // name[nw] = n+n+a[idx];
    }

    move(x[nw], dep+1, mask); move(y[nw], dep+1, mask+(1<<dep));
}
void create_circuit(int M, std::vector<int> A) {
    n = A.size(); m = M;
    for(int i=0; i<n; i++) a[i] = A[i];
    a[n] = 0; n++;

    num = 1;
    while(num < n){
        lg++; num *= 2;
    }

    C.resize(m+1);
    for(int i=0; i<=m; i++) C[i] = -1;
    
    dfs(1, 0);
    trav(1,0);
    // for(int i=1; i<=3; i++){
    //     cout << i << ' ' << x[i] << ' ' << y[i] << "xy\n";
    // }

    move(1, 0, 0);
    for(int i=0; i<num; i++){ // mask ini akhirannya kemana
        if(las[i] == -1) continue;
        name[las[i]] = n+n+a[idx];
        idx++;
    }
    bd(1, 0);
    // cout << "xx\n";

    X.resize(tim); Y.resize(tim);
    for(int i=0; i<tim; i++){ //i+1 ke mana
        X[i] = ansx[i+1], Y[i] = ansy[i+1];
        if(X[i] != -1){
            if(X[i] < n+n) X[i] = -X[i];
            else X[i] -= n+n;
        }
        if(Y[i] != -1){
            if(Y[i] < n+n) Y[i] = -Y[i];
            else Y[i] -= n+n;
        }
        // cout << i+1 << ' ' << X[i] << ' ' << Y[i] << " pp\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...