1 条题解

  • 0
    @ 2026-5-7 16:15:11
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int N, S;
        cin >> N >> S;
        vector<pair<ll, int>> events;
        ll sum_d = 0;
        for (int i = 0; i < N; ++i) {
            ll H, V;
            cin >> H >> V;
            ll d = abs(H);
            sum_d += d;
            if (d < S) {
                events.push_back({V - S, 1});
                events.push_back({V - d, -2});
                events.push_back({V, 2});
                events.push_back({V + d, -2});
                events.push_back({V + S, 1});
            } else {
                events.push_back({V - d, -1});
                events.push_back({V, 2});
                events.push_back({V + d, -1});
            }
        }
        sort(events.begin(), events.end());
        // 合并相同坐标的事件
        vector<pair<ll, int>> merged;
        for (auto &e : events) {
            if (merged.empty() || merged.back().first != e.first) {
                merged.push_back(e);
            } else {
                merged.back().second += e.second;
            }
        }
        const ll L = -4000000000LL; // 足够小的初始位置
        ll prev_x = L;
        ll f = sum_d;
        ll A = 0;
        ll ans = f;
        for (auto &e : merged) {
            ll x = e.first;
            int delta = e.second;
            f += A * (x - prev_x);
            if (f < ans) ans = f;
            A += delta;
            prev_x = x;
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    10554
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者