답안 #386785

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386785 2021-04-07T09:54:26 Z wenqi Jakarta Skyscrapers (APIO15_skyscraper) C++14
36 / 100
158 ms 190636 KB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

#define all(x) begin(x), end(x)
#define fillc(p, t, v) fill_n((t*) p, sizeof(p) / sizeof(t), v)
#define pb push_back

#define MID 169
#define O 30069
#define MAX 96900000000ll
#define K 9999999999699ll
#define OM (O / MID + 69)

int N, M;

int B[O];
int P[O];
int TP;

vector<int> SMALL[O];
vector<int> BIG[O];

ll smallc[O][MID + 69];
bool seen1[O][MID + 69];
ll bigc[O][2 * OM + 69];

ll dp_small(int, int);
ll dp_big(int, int);

ll dp_small(int pos, int step) {
    ll& ans = smallc[pos][step];
    if(ans != -2) return ans;
    ans = K;
    ll a = ans;
    if(pos == TP) return ans = 0;
    for(int j : SMALL[pos]) {
        a = min(a, dp_small(B[j], P[j]));
    }
    for(int j : BIG[pos]) {
        a = min(a, dp_big(j, OM));
    }
    if(pos - step >= 0) {
        a = min(a, 1 + dp_small(pos - step, step));
    }
    if(pos + step < N) {
        a = min(a, 1 + dp_small(pos + step, step));
    }
    if(a == K) {
        ans = -2;
        return K;
    }else{
        ans = min(ans, MAX);
        return ans = a;
    }
}

ll dp_big(int i, int offset) {
    ll& ans = bigc[i][offset];
    if(ans != -2) return ans;
    ans = MAX;
    int pos = B[i] + (offset - OM) * P[i];
    if(pos == TP) return ans = 0;
    for(int j : SMALL[pos]) {
        ans = min(ans, dp_small(B[j], P[j]));
    }
    for(int j : BIG[pos]) {
        ans = min(ans, dp_big(j, OM));
    }
    if(pos - P[i] >= 0) {
        ans = min(ans, 1 + dp_big(i, offset - 1));
    }
    if(pos + P[i] < N) {
        ans = min(ans, 1 + dp_big(i, offset + 1));
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> N >> M;
    for(int i = 0; i < M; i++) {
        cin >> B[i] >> P[i];
        if(P[i] < MID)
            SMALL[B[i]].pb(i);
        else
            BIG[B[i]].pb(i);
        if(i == 1) TP = B[i];
    }
    fillc(smallc, ll, MAX);
    fillc(bigc, ll, MAX);
    queue<pair<int, pair<int, int>>> q;
    if(P[0] < MID) {
        smallc[B[0]][P[0]] = 0;
        q.push({0, {B[0], P[0]}});
    }else{
        bigc[0][OM] = 0;
        q.push({1, {0, OM}});
    }
    while(not q.empty()) {
        auto p = q.front();
        q.pop();

        int pos, step;
        int a, b;

        int t = p.first;
        a = p.second.first;
        b = p.second.second;

        ll dis;

        if (t == 0) {
            dis = smallc[a][b];
            pos = a;
            step = b;
        }else{
            dis = bigc[a][b];
            pos = B[a] + (b - OM) * P[a];
            step = P[a];
        }

        for(int j : SMALL[pos]) {
            ll& c = smallc[B[j]][P[j]];
            if(dis < c) {
                c = dis;
                q.push({0, {B[j], P[j]}});
            }
        }

        for(int j : BIG[pos]) {
            ll& c = bigc[j][OM];
            if(dis < c) {
                c = dis;
                q.push({1, {j, OM}});
            }
        }

        if(t == 0) {
            if(pos - step >= 0) {
                ll& c = smallc[pos - step][step];
                if(dis + 1 < c) {
                    c = dis + 1;
                    q.push({t, {pos - step, step}});
                }
            }
            if(pos + step < N) {
                ll& c = smallc[pos + step][step];
                if(dis + 1 < c) {
                    c = dis + 1;
                    q.push({t, {pos + step, step}});
                }
            }
        }else{
            if(pos - step >= 0) {
                ll& c = bigc[a][b - 1];
                if(dis + 1 < c) {
                    c = dis + 1;
                    q.push({t, {a, b - 1}});
                }
            }
            if(pos + step < N) {
                ll& c = bigc[a][b + 1];
                if(dis + 1 < c) {
                    c = dis + 1;
                    q.push({t, {a, b + 1}});
                }
            }
        }
    }
    ll ans = MAX;
    for(auto k : smallc[TP])
        ans = min(ans, k);
    for(auto k : smallc[TP])
        ans = min(ans, k);
    cout << (ans >= MAX ? -1 : ans) << '\n';
    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 189932 KB Output is correct
2 Correct 103 ms 189804 KB Output is correct
3 Correct 105 ms 189932 KB Output is correct
4 Correct 102 ms 189876 KB Output is correct
5 Correct 103 ms 189804 KB Output is correct
6 Correct 106 ms 189808 KB Output is correct
7 Correct 104 ms 189804 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 189804 KB Output is correct
2 Correct 114 ms 189804 KB Output is correct
3 Correct 104 ms 189804 KB Output is correct
4 Correct 106 ms 189856 KB Output is correct
5 Correct 126 ms 189932 KB Output is correct
6 Correct 109 ms 189804 KB Output is correct
7 Correct 100 ms 189804 KB Output is correct
8 Correct 110 ms 189932 KB Output is correct
9 Correct 112 ms 189804 KB Output is correct
10 Correct 111 ms 189796 KB Output is correct
11 Correct 119 ms 189876 KB Output is correct
12 Correct 104 ms 189804 KB Output is correct
13 Correct 114 ms 189804 KB Output is correct
14 Correct 112 ms 189952 KB Output is correct
15 Correct 139 ms 189780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 110 ms 189836 KB Output is correct
2 Correct 110 ms 189804 KB Output is correct
3 Correct 100 ms 189804 KB Output is correct
4 Correct 104 ms 189804 KB Output is correct
5 Correct 106 ms 189832 KB Output is correct
6 Correct 112 ms 189792 KB Output is correct
7 Correct 121 ms 189804 KB Output is correct
8 Correct 104 ms 189804 KB Output is correct
9 Correct 126 ms 189804 KB Output is correct
10 Correct 118 ms 189868 KB Output is correct
11 Correct 102 ms 189932 KB Output is correct
12 Correct 107 ms 189804 KB Output is correct
13 Correct 102 ms 189804 KB Output is correct
14 Correct 106 ms 189836 KB Output is correct
15 Correct 107 ms 189880 KB Output is correct
16 Correct 104 ms 189880 KB Output is correct
17 Correct 108 ms 189932 KB Output is correct
18 Correct 104 ms 189804 KB Output is correct
19 Correct 101 ms 189804 KB Output is correct
20 Correct 101 ms 189932 KB Output is correct
21 Correct 102 ms 189804 KB Output is correct
22 Correct 116 ms 189804 KB Output is correct
23 Correct 103 ms 189804 KB Output is correct
24 Correct 106 ms 189928 KB Output is correct
25 Correct 122 ms 189932 KB Output is correct
26 Correct 105 ms 189804 KB Output is correct
27 Correct 101 ms 189804 KB Output is correct
28 Correct 108 ms 189932 KB Output is correct
29 Correct 103 ms 189804 KB Output is correct
30 Correct 104 ms 189804 KB Output is correct
31 Correct 111 ms 189816 KB Output is correct
32 Correct 107 ms 189932 KB Output is correct
33 Correct 106 ms 189852 KB Output is correct
34 Correct 105 ms 189932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 101 ms 189804 KB Output is correct
2 Correct 105 ms 189828 KB Output is correct
3 Correct 107 ms 189804 KB Output is correct
4 Correct 105 ms 189804 KB Output is correct
5 Correct 108 ms 189804 KB Output is correct
6 Correct 116 ms 189856 KB Output is correct
7 Correct 103 ms 189816 KB Output is correct
8 Correct 107 ms 189816 KB Output is correct
9 Correct 100 ms 189804 KB Output is correct
10 Correct 114 ms 189804 KB Output is correct
11 Correct 117 ms 189932 KB Output is correct
12 Correct 101 ms 189804 KB Output is correct
13 Correct 105 ms 189848 KB Output is correct
14 Correct 103 ms 189952 KB Output is correct
15 Correct 121 ms 189932 KB Output is correct
16 Correct 108 ms 189804 KB Output is correct
17 Correct 110 ms 189852 KB Output is correct
18 Correct 112 ms 189812 KB Output is correct
19 Correct 102 ms 189804 KB Output is correct
20 Correct 106 ms 189932 KB Output is correct
21 Correct 105 ms 189804 KB Output is correct
22 Correct 122 ms 190060 KB Output is correct
23 Correct 109 ms 189932 KB Output is correct
24 Correct 103 ms 189932 KB Output is correct
25 Correct 107 ms 189880 KB Output is correct
26 Correct 107 ms 189932 KB Output is correct
27 Correct 112 ms 189804 KB Output is correct
28 Correct 103 ms 190080 KB Output is correct
29 Correct 105 ms 189804 KB Output is correct
30 Correct 105 ms 189804 KB Output is correct
31 Correct 104 ms 189888 KB Output is correct
32 Correct 112 ms 189932 KB Output is correct
33 Correct 109 ms 189932 KB Output is correct
34 Correct 106 ms 189932 KB Output is correct
35 Correct 158 ms 190636 KB Output is correct
36 Incorrect 134 ms 190060 KB Output isn't correct
37 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 189804 KB Output is correct
2 Correct 102 ms 189804 KB Output is correct
3 Correct 105 ms 189804 KB Output is correct
4 Correct 104 ms 189868 KB Output is correct
5 Correct 104 ms 189804 KB Output is correct
6 Correct 113 ms 189804 KB Output is correct
7 Correct 103 ms 189804 KB Output is correct
8 Correct 107 ms 189804 KB Output is correct
9 Correct 113 ms 189888 KB Output is correct
10 Correct 107 ms 189804 KB Output is correct
11 Correct 121 ms 189920 KB Output is correct
12 Correct 103 ms 189804 KB Output is correct
13 Correct 115 ms 189932 KB Output is correct
14 Correct 101 ms 189932 KB Output is correct
15 Correct 102 ms 189932 KB Output is correct
16 Correct 106 ms 189804 KB Output is correct
17 Correct 106 ms 189932 KB Output is correct
18 Correct 102 ms 189804 KB Output is correct
19 Correct 103 ms 189804 KB Output is correct
20 Correct 106 ms 189932 KB Output is correct
21 Correct 103 ms 189876 KB Output is correct
22 Correct 103 ms 189844 KB Output is correct
23 Correct 104 ms 189804 KB Output is correct
24 Correct 117 ms 189932 KB Output is correct
25 Correct 103 ms 189932 KB Output is correct
26 Correct 107 ms 189864 KB Output is correct
27 Correct 105 ms 189816 KB Output is correct
28 Correct 105 ms 189932 KB Output is correct
29 Correct 107 ms 189804 KB Output is correct
30 Correct 103 ms 189804 KB Output is correct
31 Correct 107 ms 189804 KB Output is correct
32 Correct 111 ms 189804 KB Output is correct
33 Correct 108 ms 189932 KB Output is correct
34 Correct 112 ms 189932 KB Output is correct
35 Correct 144 ms 190572 KB Output is correct
36 Incorrect 115 ms 189932 KB Output isn't correct
37 Halted 0 ms 0 KB -