Submission #1266641

#TimeUsernameProblemLanguageResultExecution timeMemory
1266641tvgkPassport (JOI23_passport)C++20
46 / 100
180 ms10160 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define ll long long
#define ii pair<int, int>
#define fi first
#define se second
#define tp tuple<int, int, int>
const long mxN = 2e5 + 7, inf = 1e9 + 7;

struct T
{
    int l, r, id;
};

priority_queue<tp, vector<tp>, greater<tp>> pq;
int n, tree[mxN * 4], pre[mxN], ans[mxN];
ii dp[mxN];
T a[mxN];

bool cmp(T u, T v)
{
    return u.r < v.r;
}

void Build(int j = 1, int l = 1, int r = n)
{
    if (l == r)
    {
        tree[j] = a[l].l;
        return;
    }

    int mid = (l + r) / 2;
    Build(j * 2, l, mid);
    Build(j * 2 + 1, mid + 1, r);
    tree[j] = min(tree[j * 2], tree[j * 2 + 1]);
}

void Upd(int val, int mn, int vt, int j = 1, int l = 1, int r = n)
{
    if (a[r].r < vt || vt < tree[j])
        return;

    if (l == r)
    {
        mn = min(a[l].l, mn);
        dp[a[l].id] = {val + 1, mn};
        tree[j] = inf;
        pq.push({val + 1, mn, a[l].id});
        return;
    }

    int mid = (l + r) / 2;
    Upd(val, mn, vt, j * 2, l, mid);
    Upd(val, mn, vt, j * 2 + 1, mid + 1, r);
    tree[j] = min(tree[j * 2], tree[j * 2 + 1]);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(a".INP", "r", stdin);
    //freopen(a".OUT", "w", stdout);

    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].l >> a[i].r;
        a[i].id = i;
    }

    for (int id = 0; id <= 1; id++)
    {
        for (int i = 1; i <= n; i++)
            dp[i].fi = inf;

        sort(a + 1, a + n + 1, cmp);
        Build();

        pq.push({0, n, n});
        while (pq.size())
        {
            auto [tmp, mn, j] = pq.top();
            pq.pop();

            Upd(tmp, mn, j);
        }

        if (!id)
        {
            pre[0] = inf;
            for (int i = 1; i <= n; i++)
                pre[i] = min(pre[i - 1], dp[i].fi);
            pre[n] = 0;
        }
        else
        {
            for (int i = 1; i <= n; i++)
            {
                int j = n + 1 - i;
                ans[j] = dp[i].fi + pre[n + 1 - dp[i].se];
            }
        }

        for (int i = 1; i <= n; i++)
        {
            a[i].l = n + 1 - a[i].l;
            a[i].r = n + 1 - a[i].r;
            swap(a[i].l, a[i].r);
            a[i].id = n + 1 - a[i].id;
        }
    }

    int q;
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        int tmp;
        cin >> tmp;
        if (ans[tmp] >= inf)
            cout << -1 << '\n';
        else
            cout << ans[tmp] << '\n';
    }
}
#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...