답안 #573681

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
573681 2022-06-07T05:01:05 Z eecs Event Hopping (BOI22_events) C++17
40 / 100
1500 ms 501956 KB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 100010, SZ = 1250;
int n, q, b[maxn], rmq[17][maxn], bel[maxn], bl[maxn], br[maxn];
int num[maxn / SZ + 5][SZ + 5], tmp[maxn], sz[maxn], rb[maxn];
short pos[maxn][SZ + 5], tr[maxn][SZ + 5];
array<int, 2> a[maxn];

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n >> q;
    vector<int> V;
    for (int i = 1; i <= n; i++) {
        cin >> a[i][0] >> a[i][1], V.push_back(a[i][1]);
    }
    sort(V.begin(), V.end());
    V.resize(unique(V.begin(), V.end()) - V.begin());
    fill(b + 1, b + n + 1, n + 1);
    for (int i = 1; i <= n; i++) {
        a[i][0] = lower_bound(V.begin(), V.end(), a[i][0]) - V.begin() + 1;
        a[i][1] = lower_bound(V.begin(), V.end(), a[i][1]) - V.begin() + 1;
        b[a[i][1]] = min(b[a[i][1]], a[i][0]);
    }
    for (int i = 1; i <= n; i++) {
        br[bel[i] = (i - 1) / SZ + 1] = i;
        if (!bl[bel[i]]) bl[bel[i]] = i;
    }
    copy(b + 1, b + n + 1, rmq[0] + 1);
    for (int k = 1; k < 17; k++) {
        memcpy(rmq[k], rmq[k - 1], sizeof(rmq[k]));
        for (int i = (1 << (k - 1)) + 1; i <= n; i++) {
            rmq[k][i] = min(rmq[k][i], rmq[k - 1][i - (1 << (k - 1))]);
        }
    }
    auto qmin = [&](int l, int r) {
        int k = __lg(r - l + 1);
        return min(rmq[k][l + (1 << k) - 1], rmq[k][r]);
    };
    auto go = [&](int s, int r) {
        r = min(r, rb[s]);
        if (b[r] <= s) return r;
        for (int i = __lg(r - s + 1); ~i && r > s; i--) {
            if (rmq[i][r] > s) r -= 1 << i;
        }
        return r <= s ? 0 : r;
    };
    for (int i = 1; i <= n; i++) {
        rb[i] = n, rb[i] = go(i, n);
    }
    for (int k = 1; k <= bel[n]; k++) {
        for (int i = br[k], j = br[k]; i >= bl[k]; i--) {
            for (; j >= max(bl[k], b[i]); j--) num[k][j - bl[k]] = j < i ? i : 0;
        }
    }
    for (int i = 1; i <= n; i++) {
        int k = bel[i], L = bl[k], R = br[k];
        for (int j = num[k][i - L]; j && j <= R; j = num[k][j - L]) {
            tr[i][sz[i]++] = j - L;
        }
        for (int j = 0, k = 0; j <= R - L; j++) {
            while (k < sz[i] && tr[i][k] < j) k++;
            pos[i][j] = k;
        }
    }
    while (q--) {
        int s, t, ans = 0;
        cin >> s >> t;
        if (s == t) { cout << "0\n"; continue; }
        for (s = a[s][1]; s && s < a[t][0]; ans++) {
            if (bel[s] == bel[a[t][0]]) {
                for (int i = a[t][0], j = a[t][0]; i >= s; i--) {
                    int v = max(s, i == a[t][0] ? qmin(i, a[t][1]) : b[i]);
                    for (; j >= v; j--) tmp[j] = j < i ? i : 0;
                }
                for (; s && s < a[t][0]; ans++) s = tmp[s];
                break;
            }
            int nxt = qmin(bl[bel[s] + 1], a[t][1]);
            if (nxt <= s) {
                s = go(s, a[t][1]);
            } else {
                if (!sz[s] || nxt - bl[bel[s]] > tr[s][sz[s] - 1]) { s = 0; break; }
                int i = pos[s][nxt - bl[bel[s]]];
                ans += i, s = bl[bel[s]] + tr[s][i];
                if (s < a[t][0]) s = go(s, a[t][1]), ans++;
            }
        }
        if (a[t][0] <= s && s <= a[t][1]) cout << ans + 1 << "\n";
        else cout << "impossible\n";
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Execution timed out 1528 ms 501956 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 9 ms 11644 KB Output is correct
4 Correct 8 ms 11604 KB Output is correct
5 Correct 8 ms 11580 KB Output is correct
6 Correct 5 ms 10324 KB Output is correct
7 Correct 9 ms 11604 KB Output is correct
8 Correct 9 ms 11564 KB Output is correct
9 Correct 5 ms 9044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 9 ms 11644 KB Output is correct
4 Correct 8 ms 11604 KB Output is correct
5 Correct 8 ms 11580 KB Output is correct
6 Correct 5 ms 10324 KB Output is correct
7 Correct 9 ms 11604 KB Output is correct
8 Correct 9 ms 11564 KB Output is correct
9 Correct 5 ms 9044 KB Output is correct
10 Correct 3 ms 6612 KB Output is correct
11 Correct 3 ms 6612 KB Output is correct
12 Correct 9 ms 11604 KB Output is correct
13 Correct 7 ms 11604 KB Output is correct
14 Correct 8 ms 11548 KB Output is correct
15 Correct 6 ms 10324 KB Output is correct
16 Correct 7 ms 11604 KB Output is correct
17 Correct 7 ms 11556 KB Output is correct
18 Correct 5 ms 9044 KB Output is correct
19 Correct 281 ms 31872 KB Output is correct
20 Correct 621 ms 31900 KB Output is correct
21 Correct 208 ms 32220 KB Output is correct
22 Correct 54 ms 26012 KB Output is correct
23 Correct 50 ms 32068 KB Output is correct
24 Correct 52 ms 32052 KB Output is correct
25 Correct 349 ms 31792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 9 ms 11644 KB Output is correct
4 Correct 8 ms 11604 KB Output is correct
5 Correct 8 ms 11580 KB Output is correct
6 Correct 5 ms 10324 KB Output is correct
7 Correct 9 ms 11604 KB Output is correct
8 Correct 9 ms 11564 KB Output is correct
9 Correct 5 ms 9044 KB Output is correct
10 Correct 3 ms 6612 KB Output is correct
11 Correct 3 ms 6612 KB Output is correct
12 Correct 9 ms 11604 KB Output is correct
13 Correct 11 ms 11604 KB Output is correct
14 Correct 9 ms 11504 KB Output is correct
15 Correct 8 ms 10324 KB Output is correct
16 Correct 8 ms 11604 KB Output is correct
17 Correct 8 ms 11512 KB Output is correct
18 Correct 6 ms 9044 KB Output is correct
19 Correct 623 ms 501400 KB Output is correct
20 Correct 624 ms 501620 KB Output is correct
21 Correct 317 ms 377964 KB Output is correct
22 Correct 703 ms 501292 KB Output is correct
23 Correct 385 ms 501352 KB Output is correct
24 Correct 433 ms 501268 KB Output is correct
25 Correct 203 ms 255060 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1551 ms 501936 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Execution timed out 1528 ms 501956 KB Time limit exceeded
3 Halted 0 ms 0 KB -