답안 #768729

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
768729 2023-06-28T14:03:36 Z danikoynov Passport (JOI23_passport) C++14
54 / 100
488 ms 359344 KB
#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 = 2e5 + 10;


vector < pair < int, int > > adj[maxn * 2];
int dist[maxn * 2], lf[maxn * 2], rf[maxn * 2];
int fict, root, toi;


int build(int left, int right)
{
    ///cout << left << " :: " << right << " " << fict << endl;
    if (left == right)
        return left;
    int mid = (left + right) / 2;
    int left_child = build(left, mid);
    int right_child = build(mid + 1, right);
    int ver = ++ fict;
    adj[left_child].push_back({ver, 0});
    adj[right_child].push_back({ver, 0});
    //cout << left_child << " " << ver << " " << 0 << endl;
    //cout << right_child << " " << ver << " " << 0 << endl;
    lf[ver] = left_child;
    rf[ver] = right_child;
    return ver;
}
void graph(int _n)
{
    toi = _n;
    fict = _n;
    root = build(1, _n);

}

void range_update(int node, int l, int r, int ql, int qr, int v)
{
    if (l > qr || r < ql)
        return;

    if (l >= ql && r <= qr)
    {
        adj[node].push_back({v, 1});
        ///cout << "make edge " << node << " " << l << " " << r << " " << v << endl;
        ///cout << node << " " << v << " " << 1 << endl;
        return;
    }

    int m = (l + r) / 2;
    range_update(lf[node], l, m, ql, qr, v);
    range_update(rf[node], m + 1, r, ql, qr, v);
}
void add_range_edge(int l, int r, int v)
{
    range_update(root, 1, toi, l, r, v);
}
void add_edge(int v, int u, int w)
{
    adj[v].push_back({u, w});
    ///adj[u].push_back({v, w});
}
int used[4 * maxn];
struct edge
{
    int v, len;
    edge(int _v = 0, int _len = 0)
    {
        v = _v;
        len = _len;
    }
    bool operator < (const edge &e) const
    {
        return len > e.len;
    }
};
 queue < int > qs[maxn];
void bfs(int st, bool tf = false)
{
    for (int i = 1; i <= fict; i ++)
    {
        dist[i] = 1e9;
        used[i] = 0;
    }


    qs[0].push(st);
    dist[st] = 0;

    for (int i = 0; i < toi; i ++)
    while(!qs[i].empty())
    {
        int cur = qs[i].front();
        qs[i].pop();
        //cout << cur << " " << used[cur] << endl;
        if (used[cur])
            continue;
        used[cur] = 1;
        //if (tf)
          //  cout << "here " << v << " " << dist[v] << endl;
        for (pair < int, int > nb : adj[cur])
        {

            if (dist[nb.first] > dist[cur] + nb.second)
            {
                dist[nb.first] = dist[cur] + nb.second;
                qs[dist[cur] + nb.second].push(nb.first);
            }
        }
    }
}


int n, q, l[maxn], r[maxn];
int a[maxn], b[maxn];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> l[i] >> r[i];
    }

    graph(n + 1);
    for (int i = 1; i <= n; i ++)
    {
        add_range_edge(l[i], r[i], i);
        ///for (int j = l[i]; j <= r[i]; j ++)
        ///add_edge(j, i, 1);
        ///cout << j << " " << i << " " << 1 << endl;
    }

    bfs(1);
    for (int i = 1; i <= n; i ++)
        a[i] = dist[i];
    bfs(n);
    for (int i = 1; i <= n; i ++)
        b[i] = dist[i];

    /**for (int i = 1; i <= n; i ++)
        cout << b[i] << " ";
    cout << endl;
    return;*/
    ///cout << "------------" << endl;

    for (int i = 1; i <= n; i ++)
    {
        int edge = a[i] + b[i];
        if (a[i] > 0 && b[i] > 0)
            edge --;
        add_edge(n + 1, i, edge);
        ///cout << n + 1 << " " << i << " " << a[i] << " " << b[i] << endl;
    }

    bfs(n + 1, 1);
    /**for (int i = 1; i <= n; i ++)
        cout << dist[i] << " ";
    cout << endl;*/
    cin >> q;
    for (int i = 1; i <= q; i ++)
    {
        int x;
        cin >> x;
        int ans = dist[x];
        if (ans > n)
            cout << -1 << endl;
        else
            cout << ans << endl;
    }



}

int main()
{
    speed();
    ///freopen("text.txt", "r", stdin);
    solve();
    return 0;
}
/**
9
1 1
2 2
3 3
1 4
2 8
5 7
4 9
8 8
9 9
1
6

*/
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 144292 KB Output is correct
2 Correct 66 ms 144396 KB Output is correct
3 Correct 66 ms 144276 KB Output is correct
4 Correct 452 ms 196056 KB Output is correct
5 Correct 244 ms 175360 KB Output is correct
6 Correct 203 ms 170316 KB Output is correct
7 Correct 205 ms 194292 KB Output is correct
8 Correct 165 ms 188064 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 144372 KB Output is correct
2 Correct 68 ms 144368 KB Output is correct
3 Correct 67 ms 144320 KB Output is correct
4 Correct 67 ms 144360 KB Output is correct
5 Correct 69 ms 144332 KB Output is correct
6 Correct 67 ms 144392 KB Output is correct
7 Correct 68 ms 144396 KB Output is correct
8 Correct 73 ms 144360 KB Output is correct
9 Correct 67 ms 144388 KB Output is correct
10 Correct 68 ms 144332 KB Output is correct
11 Correct 76 ms 144364 KB Output is correct
12 Correct 80 ms 144332 KB Output is correct
13 Correct 77 ms 144468 KB Output is correct
14 Correct 77 ms 144356 KB Output is correct
15 Correct 94 ms 144428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 144372 KB Output is correct
2 Correct 68 ms 144368 KB Output is correct
3 Correct 67 ms 144320 KB Output is correct
4 Correct 67 ms 144360 KB Output is correct
5 Correct 69 ms 144332 KB Output is correct
6 Correct 67 ms 144392 KB Output is correct
7 Correct 68 ms 144396 KB Output is correct
8 Correct 73 ms 144360 KB Output is correct
9 Correct 67 ms 144388 KB Output is correct
10 Correct 68 ms 144332 KB Output is correct
11 Correct 76 ms 144364 KB Output is correct
12 Correct 80 ms 144332 KB Output is correct
13 Correct 77 ms 144468 KB Output is correct
14 Correct 77 ms 144356 KB Output is correct
15 Correct 94 ms 144428 KB Output is correct
16 Correct 81 ms 144884 KB Output is correct
17 Correct 80 ms 144840 KB Output is correct
18 Correct 78 ms 145048 KB Output is correct
19 Correct 89 ms 144972 KB Output is correct
20 Correct 69 ms 144672 KB Output is correct
21 Correct 81 ms 144820 KB Output is correct
22 Correct 81 ms 145036 KB Output is correct
23 Correct 75 ms 144880 KB Output is correct
24 Correct 85 ms 144860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 144372 KB Output is correct
2 Correct 68 ms 144368 KB Output is correct
3 Correct 67 ms 144320 KB Output is correct
4 Correct 67 ms 144360 KB Output is correct
5 Correct 69 ms 144332 KB Output is correct
6 Correct 67 ms 144392 KB Output is correct
7 Correct 68 ms 144396 KB Output is correct
8 Correct 73 ms 144360 KB Output is correct
9 Correct 67 ms 144388 KB Output is correct
10 Correct 68 ms 144332 KB Output is correct
11 Correct 76 ms 144364 KB Output is correct
12 Correct 80 ms 144332 KB Output is correct
13 Correct 77 ms 144468 KB Output is correct
14 Correct 77 ms 144356 KB Output is correct
15 Correct 94 ms 144428 KB Output is correct
16 Correct 81 ms 144884 KB Output is correct
17 Correct 80 ms 144840 KB Output is correct
18 Correct 78 ms 145048 KB Output is correct
19 Correct 89 ms 144972 KB Output is correct
20 Correct 69 ms 144672 KB Output is correct
21 Correct 81 ms 144820 KB Output is correct
22 Correct 81 ms 145036 KB Output is correct
23 Correct 75 ms 144880 KB Output is correct
24 Correct 85 ms 144860 KB Output is correct
25 Correct 69 ms 144348 KB Output is correct
26 Correct 67 ms 144332 KB Output is correct
27 Correct 96 ms 144912 KB Output is correct
28 Correct 79 ms 144864 KB Output is correct
29 Correct 68 ms 144736 KB Output is correct
30 Correct 77 ms 144832 KB Output is correct
31 Correct 95 ms 144868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 144292 KB Output is correct
2 Correct 66 ms 144396 KB Output is correct
3 Correct 66 ms 144276 KB Output is correct
4 Correct 452 ms 196056 KB Output is correct
5 Correct 244 ms 175360 KB Output is correct
6 Correct 203 ms 170316 KB Output is correct
7 Correct 205 ms 194292 KB Output is correct
8 Correct 165 ms 188064 KB Output is correct
9 Correct 66 ms 144372 KB Output is correct
10 Correct 68 ms 144368 KB Output is correct
11 Correct 67 ms 144320 KB Output is correct
12 Correct 67 ms 144360 KB Output is correct
13 Correct 69 ms 144332 KB Output is correct
14 Correct 67 ms 144392 KB Output is correct
15 Correct 68 ms 144396 KB Output is correct
16 Correct 73 ms 144360 KB Output is correct
17 Correct 67 ms 144388 KB Output is correct
18 Correct 68 ms 144332 KB Output is correct
19 Correct 76 ms 144364 KB Output is correct
20 Correct 80 ms 144332 KB Output is correct
21 Correct 77 ms 144468 KB Output is correct
22 Correct 77 ms 144356 KB Output is correct
23 Correct 94 ms 144428 KB Output is correct
24 Correct 81 ms 144884 KB Output is correct
25 Correct 80 ms 144840 KB Output is correct
26 Correct 78 ms 145048 KB Output is correct
27 Correct 89 ms 144972 KB Output is correct
28 Correct 69 ms 144672 KB Output is correct
29 Correct 81 ms 144820 KB Output is correct
30 Correct 81 ms 145036 KB Output is correct
31 Correct 75 ms 144880 KB Output is correct
32 Correct 85 ms 144860 KB Output is correct
33 Correct 69 ms 144348 KB Output is correct
34 Correct 67 ms 144332 KB Output is correct
35 Correct 96 ms 144912 KB Output is correct
36 Correct 79 ms 144864 KB Output is correct
37 Correct 68 ms 144736 KB Output is correct
38 Correct 77 ms 144832 KB Output is correct
39 Correct 95 ms 144868 KB Output is correct
40 Correct 488 ms 196332 KB Output is correct
41 Correct 266 ms 176828 KB Output is correct
42 Correct 339 ms 203896 KB Output is correct
43 Correct 311 ms 203968 KB Output is correct
44 Correct 231 ms 171964 KB Output is correct
45 Runtime error 328 ms 359344 KB Execution killed with signal 11
46 Halted 0 ms 0 KB -