Submission #1217427

#TimeUsernameProblemLanguageResultExecution timeMemory
1217427perekopskadMechanical Doll (IOI18_doll)C++20
85.55 / 100
147 ms14408 KiB
#include "doll.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define el '\n'
#define pb push_back
#define pii pair <ll, ll>
#define ff first
#define ss second
#define mkp make_pair
#define fr(i, l, r) for(ll (i) = l; (i) <= r; (i)++)
#define frb(i, r, l) for(ll (i) = r; (i) >= l; (i)--)

template<class T, class S>
inline bool chmax(T &a, const S &b) {
    return (a < b ? a = b, 1 : 0);
}

template<class T, class S>
inline bool chmin(T &a, const S &b) {
    return (a > b ? a = b, 1 : 0);
}

ll const N = 1e5 + 10;
ll const LOG = 22;
ll const inf = 1e9 + 10;
ll const INF = 1e18 + 10;
ll const mod = 1e9 + 7;
ll const mod2 = 998244353;
ll const K = 400;

vector <int> g[N], c, x, y;
ll cur = 0;

vector <pii> fll;

void gofuck(ll i, ll st, ll l, ll r, ll left) {
    ll mid = (l + r) / 2;
    
    if(mid <= left)
        x[i - 1] = st;
    else {
        if(l < mid) {
            x.pb(0);
            y.pb(0);
            ++cur;
            x[i - 1] = -cur;
            gofuck(cur, st, l, mid, left);
        }
        else {
            fll.pb({2 * (i - 1), l - 1});
        }
    }
    if(mid + 1 < r) {
        x.pb(0);
        y.pb(0);
        ++cur;
        y[i - 1] = -cur;
        gofuck(cur, st, mid + 1, r, left);
    }
    else {
        fll.pb({2 * (i - 1) + 1, mid});
    }
}

bool comp(pii a, pii b) {
    while(a.ss || b.ss) {
        if(a.ss % 2 != b.ss % 2)
            return a.ss % 2 < b.ss % 2;
        a.ss /= 2; b.ss /= 2;
    }
    return 0;
}

void build(ll v) {
    ll s = g[v].size();
    if(!s) return;
    if(s == 1) {
        c[v] = g[v][0];
        return;
    }
    ll val = __lg(2 * s - 1);
    val = (1 << val);

    ll left = val - s;
    x.pb(0); y.pb(0);
    ++cur;
    c[v] = -cur;
    gofuck(cur, -cur, 1, val, left);

    sort(fll.begin(), fll.end(), comp);
    ll it = 0;
    for(auto [u, l] : fll) {
        ll id = u / 2;
        if(u % 2 == 0) {
            x[id] = g[v][it];
        }
        else {
            y[id] = g[v][it];
        }
        it++;
    }
    fll.clear();
}

void create_circuit(int M, std::vector<int> A) {
    c.resize(M + 1);
    g[0].pb(A[0]);
    fr(i, 1, A.size() - 1)
        g[A[i - 1]].pb(A[i]);

    g[A.back()].pb(0);

    fr(v, 0, M) {
        build(v);
    }
    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...