답안 #873113

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
873113 2023-11-14T13:23:09 Z boris_mihov Passport (JOI23_passport) C++17
54 / 100
578 ms 334556 KB
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>

typedef long long llong;
const int MAXN = 200000 + 10;
const int INF = 1e9;

int n;
std::vector <std::pair <int,int>> g[2 * MAXN];
struct SegmentTree
{
    int cnt;
    int tree[4*MAXN];

    void build(int l, int r, int node)
    {
        if (l == r)
        {
            tree[node] = l;
            return;
        }

        tree[node] = ++cnt;
        int mid = (l + r) / 2;
        build(l, mid, 2*node);
        build(mid + 1, r, 2*node + 1);
        g[tree[2 * node]].push_back({tree[node], 0});
        g[tree[2 * node + 1]].push_back({tree[node], 0});
    }

    void addEdges(int l, int r, int node, int queryL, int queryR, int queryNode)
    {
        if (queryL <= l && r <= queryR)
        {
            g[tree[node]].push_back({queryNode, 1});
            return;
        }

        int mid = (l + r) / 2;
        if (queryL <= mid) addEdges(l, mid, 2*node, queryL, queryR, queryNode);
        if (mid + 1 <= queryR) addEdges(mid + 1, r, 2*node + 1, queryL, queryR, queryNode);
    }

    void build()
    {
        cnt = n;
        build(1, n, 1);
    }

    void addEdges(int to, int l, int r)
    {
        addEdges(1, n, 1, l, r, to);
    }
};

int queries;
int l[MAXN];
int r[MAXN];
int dist[2 * MAXN];
int distA[2 * MAXN];
int distB[2 * MAXN];
std::queue <int> q[2 * MAXN];
std::deque <int> dq;
SegmentTree tree;
bool vis[MAXN];

void solve()
{
    tree.build();
    for (int i = 1 ; i <= n ; ++i)
    {
        tree.addEdges(i, l[i], r[i]);
    }   

    std::fill(distA + 1, distA + 1 + tree.cnt, INF);
    std::fill(distB + 1, distB + 1 + tree.cnt, INF);
    dq.push_back(1);
    distA[1] = 0;

    while (!dq.empty())
    {
        int top = dq.front();
        dq.pop_front();

        for (const auto &[u, d] : g[top])
        {
            if (distA[u] > distA[top] + d)
            {
                distA[u] = distA[top] + d;
                if (d == 0) dq.push_front(u);
                else dq.push_back(u);
            }
        }   
    }

    dq.push_back(n);
    distB[n] = 0;

    while (!dq.empty())
    {
        int top = dq.front();
        dq.pop_front();

        for (const auto &[u, d] : g[top])
        {
            if (distB[u] > distB[top] + d)
            {
                distB[u] = distB[top] + d;
                if (d == 0) dq.push_front(u);
                else dq.push_back(u);
            }
        }   
    }

    for (int i = 1 ; i <= n ; ++i)
    {
        dist[i] = distA[i] + distB[i] - (distA[i] > 0 && distB[i] > 0);
        if (dist[i] <= 2 * n) q[dist[i]].push(i);
    }

    std::fill(dist + n + 1, dist + tree.cnt + 1, INF);
    for (int d = 0 ; d <= n ; ++d)
    {
        while (!q[d].empty())
        {
            int top = q[d].front();
            q[d].pop();

            if (vis[top])
            {
                continue;
            }

            vis[top] = true;
            for (const auto &[u, d] : g[top])
            {
                if (dist[u] > dist[top] + d)
                {
                    dist[u] = dist[top] + d;
                    q[dist[u]].push(u);
                }
            }
        }
    }

    for (int i = 1 ; i <= queries ; ++i)
    {
        int node;
        std::cin >> node;
        if (dist[node] <= n) std::cout << dist[node] << '\n';
        else std::cout << -1 << '\n';
    }
}

void input()
{
    std::cin >> n;
    for (int i = 1 ; i <= n ; ++i)
    {
        std::cin >> l[i] >> r[i];
    }

    std::cin >> queries;
}

void fastIOI()
{
    std::ios_base :: sync_with_stdio(0);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
}

int main()
{
    fastIOI();
    input();
    solve();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 288536 KB Output is correct
2 Correct 130 ms 288340 KB Output is correct
3 Correct 142 ms 288456 KB Output is correct
4 Correct 508 ms 330540 KB Output is correct
5 Correct 304 ms 310272 KB Output is correct
6 Correct 227 ms 305084 KB Output is correct
7 Correct 198 ms 303164 KB Output is correct
8 Correct 210 ms 310564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 288340 KB Output is correct
2 Correct 127 ms 288336 KB Output is correct
3 Correct 139 ms 288344 KB Output is correct
4 Correct 126 ms 288336 KB Output is correct
5 Correct 132 ms 288476 KB Output is correct
6 Correct 127 ms 288332 KB Output is correct
7 Correct 134 ms 288536 KB Output is correct
8 Correct 128 ms 288336 KB Output is correct
9 Correct 129 ms 288448 KB Output is correct
10 Correct 146 ms 288412 KB Output is correct
11 Correct 133 ms 288596 KB Output is correct
12 Correct 127 ms 288336 KB Output is correct
13 Correct 140 ms 288592 KB Output is correct
14 Correct 129 ms 288340 KB Output is correct
15 Correct 131 ms 288336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 288340 KB Output is correct
2 Correct 127 ms 288336 KB Output is correct
3 Correct 139 ms 288344 KB Output is correct
4 Correct 126 ms 288336 KB Output is correct
5 Correct 132 ms 288476 KB Output is correct
6 Correct 127 ms 288332 KB Output is correct
7 Correct 134 ms 288536 KB Output is correct
8 Correct 128 ms 288336 KB Output is correct
9 Correct 129 ms 288448 KB Output is correct
10 Correct 146 ms 288412 KB Output is correct
11 Correct 133 ms 288596 KB Output is correct
12 Correct 127 ms 288336 KB Output is correct
13 Correct 140 ms 288592 KB Output is correct
14 Correct 129 ms 288340 KB Output is correct
15 Correct 131 ms 288336 KB Output is correct
16 Correct 130 ms 288852 KB Output is correct
17 Correct 128 ms 288828 KB Output is correct
18 Correct 132 ms 289012 KB Output is correct
19 Correct 146 ms 289056 KB Output is correct
20 Correct 141 ms 288596 KB Output is correct
21 Correct 128 ms 288592 KB Output is correct
22 Correct 149 ms 288848 KB Output is correct
23 Correct 143 ms 288596 KB Output is correct
24 Correct 144 ms 288676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 288340 KB Output is correct
2 Correct 127 ms 288336 KB Output is correct
3 Correct 139 ms 288344 KB Output is correct
4 Correct 126 ms 288336 KB Output is correct
5 Correct 132 ms 288476 KB Output is correct
6 Correct 127 ms 288332 KB Output is correct
7 Correct 134 ms 288536 KB Output is correct
8 Correct 128 ms 288336 KB Output is correct
9 Correct 129 ms 288448 KB Output is correct
10 Correct 146 ms 288412 KB Output is correct
11 Correct 133 ms 288596 KB Output is correct
12 Correct 127 ms 288336 KB Output is correct
13 Correct 140 ms 288592 KB Output is correct
14 Correct 129 ms 288340 KB Output is correct
15 Correct 131 ms 288336 KB Output is correct
16 Correct 130 ms 288852 KB Output is correct
17 Correct 128 ms 288828 KB Output is correct
18 Correct 132 ms 289012 KB Output is correct
19 Correct 146 ms 289056 KB Output is correct
20 Correct 141 ms 288596 KB Output is correct
21 Correct 128 ms 288592 KB Output is correct
22 Correct 149 ms 288848 KB Output is correct
23 Correct 143 ms 288596 KB Output is correct
24 Correct 144 ms 288676 KB Output is correct
25 Correct 128 ms 288536 KB Output is correct
26 Correct 133 ms 288752 KB Output is correct
27 Correct 134 ms 288924 KB Output is correct
28 Correct 132 ms 288848 KB Output is correct
29 Correct 142 ms 288744 KB Output is correct
30 Correct 131 ms 288596 KB Output is correct
31 Correct 129 ms 288592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 288536 KB Output is correct
2 Correct 130 ms 288340 KB Output is correct
3 Correct 142 ms 288456 KB Output is correct
4 Correct 508 ms 330540 KB Output is correct
5 Correct 304 ms 310272 KB Output is correct
6 Correct 227 ms 305084 KB Output is correct
7 Correct 198 ms 303164 KB Output is correct
8 Correct 210 ms 310564 KB Output is correct
9 Correct 131 ms 288340 KB Output is correct
10 Correct 127 ms 288336 KB Output is correct
11 Correct 139 ms 288344 KB Output is correct
12 Correct 126 ms 288336 KB Output is correct
13 Correct 132 ms 288476 KB Output is correct
14 Correct 127 ms 288332 KB Output is correct
15 Correct 134 ms 288536 KB Output is correct
16 Correct 128 ms 288336 KB Output is correct
17 Correct 129 ms 288448 KB Output is correct
18 Correct 146 ms 288412 KB Output is correct
19 Correct 133 ms 288596 KB Output is correct
20 Correct 127 ms 288336 KB Output is correct
21 Correct 140 ms 288592 KB Output is correct
22 Correct 129 ms 288340 KB Output is correct
23 Correct 131 ms 288336 KB Output is correct
24 Correct 130 ms 288852 KB Output is correct
25 Correct 128 ms 288828 KB Output is correct
26 Correct 132 ms 289012 KB Output is correct
27 Correct 146 ms 289056 KB Output is correct
28 Correct 141 ms 288596 KB Output is correct
29 Correct 128 ms 288592 KB Output is correct
30 Correct 149 ms 288848 KB Output is correct
31 Correct 143 ms 288596 KB Output is correct
32 Correct 144 ms 288676 KB Output is correct
33 Correct 128 ms 288536 KB Output is correct
34 Correct 133 ms 288752 KB Output is correct
35 Correct 134 ms 288924 KB Output is correct
36 Correct 132 ms 288848 KB Output is correct
37 Correct 142 ms 288744 KB Output is correct
38 Correct 131 ms 288596 KB Output is correct
39 Correct 129 ms 288592 KB Output is correct
40 Incorrect 578 ms 334556 KB Output isn't correct
41 Halted 0 ms 0 KB -