Submission #1139485

#TimeUsernameProblemLanguageResultExecution timeMemory
1139485BlockOG철로 (IOI14_rail)C++20
100 / 100
614 ms1548 KiB
#include <bits/stdc++.h>
#include "rail.h"

// mrrrow meeeow nyaa :3c
// play vivid/stasis! it's a really awesome free game on steam

#define fo(i, a, b) for (auto i = (a); i < (b); i++)
#define of(i, a, b) for (auto i = (b); i-- > (a);)

#define pb push_back
#define pob pop_back
#define p push
#define po pop
#define f first
#define s second
#define ub upper_bound
#define lb lower_bound
#define be(a) a.begin(), a.end()

using namespace std;

int ____init = []
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    return 0;
}();

map<pair<int, int>, int> cache;
int dist(int i, int j)
{
    if (i == j)
        return 0;
    if (i > j)
        swap(i, j);
    if (cache.count({i, j}))
        return cache[{i, j}];
    return cache[{i, j}] = getDistance(i, j);
}

void findLocation(int n, int first, int location[], int stype[])
{
    vector<int> b;

    location[0] = first;
    stype[0] = 1;
    fo(i, 1, n)
    {
        location[i] = first + dist(0, i), stype[i] = 2;
        b.pb(i);
    }

    sort(be(b), [&](int &i, int &j)
         { return location[i] < location[j]; });

    vector<int> c;
    vector<int> d;
    for (int i : b)
    {
        of(j, 0, c.size())
        {
            if (dist(0, i) == dist(0, c.back()) + dist(c.back(), i) - 2 * (location[c.back()] - location[c[j]]))
            {
                location[i] = location[c.back()] - dist(c.back(), i);
                stype[i] = 1;
                if (location[i] < first)
                    d.pb(i);

                goto cont;
            }
        }

        c.pb(i);

    cont:;
    }

    sort(be(d), [&](int &i, int &j)
         { return location[i] > location[j]; });

    vector<int> e;
    for (int i : d)
    {
        of(j, 0, e.size())
        {
            if (dist(0, i) == dist(0, e.back()) + dist(e.back(), i) - 2 * (location[e[j]] - location[e.back()]))
            {
                location[i] = location[e.back()] + dist(e.back(), i);
                stype[i] = 2;

                goto cont2;
            }
        }

        e.pb(i);

    cont2:;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...