제출 #1326233

#제출 시각아이디문제언어결과실행 시간메모리
1326233eysbutnoCircus (Balkan15_CIRCUS)C++20
100 / 100
771 ms15900 KiB
#include <bits/stdc++.h>

using ll = long long;

constexpr int INF = 1e9;

std::map<int, int> best_f, best_r;

void init(int n, int m, int p[]) {
    std::sort(p, p + n);

    // dist[i] = {dist from left, dist from right}
    std::vector<std::array<int, 2>> dist(n, {INF, INF});
    std::priority_queue<std::array<int, 3>> pq;
    for (int i = 0; i < n; i++) {
        // initialize left dist with jump from m
        pq.push({-(m - p[i]), i, 0});
    }

    while (!pq.empty()) {
        auto [t, u, f] = pq.top();
        pq.pop();
        t *= -1;
        if (dist[u][f] <= t) continue;
        dist[u][f] = t;

        // use 'ghost edge'
        if (f == 0 && u > 0) {
            pq.push({-(t + p[u] - p[u - 1]), u - 1, 0});
        } else if (f == 1 && u + 1 < n) {
            pq.push({-(t + p[u + 1] - p[u]), u + 1, 1});
        }

        // jump forward by t
        int nxt = std::lower_bound(p, p + n, p[u] + t) - p;
        if (nxt < n) {
            pq.push({-(p[nxt] - p[u]), nxt, 1});
        }

        // jump backwards by t
        nxt = std::upper_bound(p, p + n, p[u] - t) - p - 1;
        if (nxt >= 0) {
            pq.push({-(p[u] - p[nxt]), nxt, 0});
        }
    }

    for (int i = 0; i < n; i++) {
        dist[i][0] = std::min(dist[i][0], dist[i][1]);
    }

    std::vector<int> ord(n);
    std::iota(ord.begin(), ord.end(), 0);
    std::sort(ord.begin(), ord.end(), [&](int x, int y) -> bool {
        return p[x] - dist[x][0] > p[y] - dist[y][0];
    });

    int best = INF;
    for (int i : ord) {
        best = std::min(best, p[i]);
        best_f[p[i] - dist[i][0]] = best;
    }

    best = -INF;
    std::sort(ord.begin(), ord.end(), [&](int x, int y) -> bool {
        return p[x] + dist[x][0] < p[y] + dist[y][0];
    });

    for (int i : ord) {
        best = std::max(best, p[i]);
        best_r[p[i] + dist[i][0]] = best;
    }

    best_f[m] = m;
}

int minLength(int d) {
    int best = INF;

    auto it = best_f.lower_bound(d);
    if (it != best_f.end()) {
        best = std::min(best, (it->second) - d);
    }

    it = best_r.upper_bound(d);
    if (it != best_r.begin()) {
        --it;
        best = std::min(best, d - (it->second));
    }

    return best;
}

컴파일 시 표준 에러 (stderr) 메시지

grader.cpp: In function 'int main()':
grader.cpp:16:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |         scanf("%d%d", &N, &M);
      |         ~~~~~^~~~~~~~~~~~~~~~
grader.cpp:18:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |                 scanf("%d", &P[i]);
      |                 ~~~~~^~~~~~~~~~~~~
grader.cpp:21:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |         scanf("%d", &Q);
      |         ~~~~~^~~~~~~~~~
grader.cpp:23:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |                 scanf("%d", &d);
      |                 ~~~~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...