Submission #636967

#TimeUsernameProblemLanguageResultExecution timeMemory
636967danikoynovRailway Trip 2 (JOI22_ho_t4)C++14
8 / 100
2090 ms3160 KiB
/**
 ____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|

**/

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 1e5 + 10;

struct road
{
    int a, b;
} r[maxn];

struct interval
{
    int l, r, idx;

    interval(int _l = 0, int _r = 0, int _idx = 0)
    {
        l = _l;
        r = _r;
        idx = _idx;
    }

    bool operator < (const interval &it) const
    {
        return make_pair(l, r) < make_pair(it.l, it.r);
    }
};

int n, k, m, q;

bool on_train(int pos, int idx)
{
    if (r[idx].a < r[idx].b)
    {
        return (pos >= r[idx].a && pos <= r[idx].a + k - 1);
    }
    else
    {
        return (pos >= r[idx].a - k + 1 && pos <= r[idx].a);
    }
}

int used[maxn];
int par[maxn], lf[maxn], rf[maxn];

int find_leader(int v)
{
    if (v == par[v])
        return v;
    return (par[v] = find_leader(par[v]));
}
void unite(int v, int u)
{
    v = find_leader(v);
    u = find_leader(u);
    par[u] = v;
    lf[v] = min(lf[v], lf[u]);
    rf[v] = max(rf[v], rf[u]);
}
int solve_query(int s, int t)
{
    for (int i = 1; i <= n; i ++)
    {
        used[i] = 0;
        par[i] = lf[i] = rf[i] = i;
    }
    queue < int > q;
    used[s] = 1;
    lf[s] = s - 1;
    rf[s] = s + 1;
    q.push(s);
    while(!q.empty())
    {
        int cur = q.front();
        q.pop();
        ///cout << "cur: " << cur << endl;
        for (int i = 1; i <= m; i ++)
        {
            if (on_train(cur, i))
            {
                if (r[i].a < r[i].b)
                {
                    int j = cur;
                    while(j <= r[i].b)
                    {
                        if (used[j])
                        {
                            j = rf[find_leader(j)];
                            continue;
                        }
                        used[j] = used[cur] + 1;
                        lf[j] = j - 1;
                        rf[j] = j + 1;
                        if (used[j - 1])
                            unite(j, j - 1);
                        if (used[j + 1])
                            unite(j, j + 1);
                        q.push(j);
                        j ++;
                    }
                }
                else
                {
                    int j = cur;
                    while(j >= r[i].b)
                    {
                        if (used[j])
                        {
                            j = lf[find_leader(j)];
                            continue;
                        }

                        used[j] = used[cur] + 1;
                        lf[j] = j - 1;
                        rf[j] = j + 1;
                        if (used[j - 1])
                            unite(j, j - 1);
                        if (used[j + 1])
                            unite(j, j + 1);
                        q.push(j);
                        j --;
                    }

                }
            }
        }
    }

    return used[t] - 1;

}
void solve()
{
    cin >> n >> k;
    cin >> m;
    for (int i = 1; i <= m; i ++)
        cin >> r[i].a >> r[i].b;

    cin >> q;
    for (int i = 1; i <= q; i ++)
    {
        int s, t;
        cin >> s >> t;
        int ans = solve_query(s, t);
        cout << ans << endl;
    }
}

int main()
{
    speed();
    solve();
    return 0;
}
/**
5 2
2
5 1
3 5
1
3 2
*/
#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...