Submission #1261231

#TimeUsernameProblemLanguageResultExecution timeMemory
1261231FaggiObstacles for a Llama (IOI25_obstacles)C++20
0 / 100
60 ms27448 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;
vector<ll> t, h, seg, I, D;
vector<pair<ll, ll>> seg2;

const int MAXN = 2e1 + 1;
const int LOG = 20;

ll iz[MAXN][LOG], der[MAXN][LOG], maIz[MAXN][LOG], maDer[MAXN][LOG];
ll n, m, pot = 1;
void initialize(std::vector<int> T, std::vector<int> H)
{
    for (auto k : T)
        t.pb(k);
    for (auto k : H)
        h.pb(k);
    while (pot < sz(h))
        pot *= 2;
    seg.resize(pot * 2, 0);
    seg2.resize(pot * 2, {LLONG_MAX, -1});
    I.resize(pot * 2);
    D.resize(pot * 2);
    ll i;
    for (i = pot; i < pot * 2; i++)
        I[i] = D[i] = i;
    for (i = 0; i < sz(H); i++)
    {
        seg[i + pot] = H[i];
        seg2[i + pot] = {H[i], i};
    }
    for (i = pot - 1; i > 0; i--)
    {
        I[i] = I[i * 2];
        D[i] = D[i * 2 + 1];
        seg[i] = max(seg[i * 2], seg[i * 2 + 1]);
        seg2[i] = seg2[i * 2];
        if (seg2[i * 2 + 1].fr < seg2[i].fr)
            seg2[i] = seg2[i * 2 + 1];
    }
    ll j;
    for (j = 0; j < sz(H); j++)
    {
        iz[j][0]=max(0ll,j-1);
        der[j][0]=j+1;
        maIz[j][0]=H[j];
        if(j-1>=0)
            maIz[j][0]=max(maIz[j][0],h[j-1]);
        maDer[j][0]=h[j];
        if(j+1<sz(H))
            maDer[j][0]=max(maDer[j][0],h[j+1]);
    }
    for (i = 1; i < LOG; i++)
    {
        for (j = 0; j < sz(H); j++)
        {
            iz[j][i]=iz[iz[j][i-1]][i-1];
            maIz[j][i]=max(maIz[j][i-1],maIz[iz[j][i-1]][i-1]);
        }
        for (j = sz(H)-1; j>=0; j--)
        {
            der[j][i]=der[der[j][i-1]][i-1];
            maDer[j][i]=max(maDer[j][i-1],maDer[der[j][i-1]][i-1]);
        }
    }
    return;
}

ll calc(ll a, ll b, ll nod)
{
    if (I[nod] > b || D[nod] < a)
        return 0;
    if (I[nod] >= a && D[nod] <= b)
        return seg[nod];
    return max(calc(a, b, nod * 2), calc(a, b, nod * 2 + 1));
}

pair<ll, ll> calc2(ll a, ll b, ll nod)
{
    if (I[nod] > b || D[nod] < a)
        return {LLONG_MAX, -1};
    if (I[nod] >= a && D[nod] <= b)
        return seg2[nod];
    pair<ll, ll> r1, r2;
    r1 = calc2(a, b, nod * 2);
    r2 = calc2(a, b, nod * 2 + 1);
    if (r1.fr > r2.fr)
        return r2;
    return r1;
}

bool con(ll i, ll ja, ll jb)
{
    ll ma = 0, j;
    ma = calc(ja + pot, jb + pot, 1);
    if (ma >= t[i])
        return 0;
    return 1;
}

ll minR(ll i, ll j)
{
    ll mi = LLONG_MAX, pj = -1, k, l = 0, r = j, piv, ma, pos = -1, act;
    act=j;
    for(k=LOG-1; k>=0; k--)
    {
        if(maIz[act][k]<t[i])
            act=iz[act][k];
    }
    pos=act;
    pair<ll, ll> ret;
    if (pos != -1)
    {
        ret = calc2(pos + pot, j + pot, 1);
        if (mi > ret.fr)
        {
            mi = ret.fr;
            pj = ret.se;
        }
    }
    pos = -1;
    act=j;
    for(k=LOG-1; k>=0; k--)
    {
        if(maDer[act][k]<t[i])
            act=der[act][k];
    }
    if (pos != -1)
    {
        ret = calc2(j + pot, pos + pot, 1);
        if (mi > ret.fr)
        {
            mi = ret.fr;
            pj = ret.se;
        }
    }
    return pj;
}

bool can_reach(int L, int R, int S, int D)
{
    n = sz(t);
    m = sz(h);
    ll i;
    if (S > D)
        swap(S, D);
    for (i = 0; i < n; i++)
    {
        if (con(i, S, D))
            return 1;
        if (i + 1 < n)
        {
            S = minR(i, S);
            D = minR(i, D);
            if (S == -1 || D == -1)
                return 0;
        }
    }
    return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...