WA on 3,4,9,10,求调
查看原帖
WA on 3,4,9,10,求调
1067927
WL688楼主2024/8/1 17:34
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    int64_t d, k;
    cin >> n >> d >> k;
    vector<int64_t> x(n + 1, 0), s(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> x[i] >> s[i];
    }

    auto check = [&](const int64_t v) -> bool
    {
        vector<int64_t> dp(n + 1);
        dp[0] = 0;
        deque<int> q;
        int pre_i = -1; // 最后入队的元素索引

        for (int i = 1; i <= n; i++)
        {
            while (!q.empty() && (x[i] - x[q.front()] < max(d - v, (int64_t)1) || x[i] - x[q.front()] > d + v))
            {
                q.pop_front();
            }
            while (pre_i + 1 <= n && x[i] - x[pre_i + 1] >= max(d - v, (int64_t)1) && x[i] - x[pre_i + 1] <= d + v)
            {
                while (!q.empty() && dp[pre_i + 1] > dp[q.back()])
                {
                    q.pop_back();
                }
                q.push_back(pre_i + 1);
                pre_i++;
            }
            if (q.empty())
            {
                dp[i] = -0x3f3f3f3f3f3f3f3f;
            }
            else
            {
                dp[i] = s[i] + dp[q.front()];
            }
        }

        return *max_element(++dp.begin(), dp.end()) >= k;
    };

    int64_t left = 0, right = 1e11;
    int64_t ans = -1;
    while (left <= right)
    {
        int64_t mid = (left + right) / 2;
        if (check(mid))
        {
            ans = mid;
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    cout << ans;

    return 0;
}
2024/8/1 17:34
加载中...