70pts WA4 9 10玄关求调
查看原帖
70pts WA4 9 10玄关求调
1283408
nyssc楼主2024/12/13 14:08
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int MAXN = 500005, INF = 1000000000000000010ll;
struct P{
    int x, s;
}a[MAXN];
int dp[MAXN];
int n, d, k;
bool check(int g){
    memset(dp, 0, sizeof(dp));
    int i{1}, j{};
    for(;i <= n && a[i].x <d - g;i++)dp[i] = -INF;
    deque<int> q;
    int ans{-INF};
    for(;i<=n;i++){
        while(a[j].x + g + d < a[i].x)j++;
        while(!q.empty() && a[q.front()].x + d + g < a[i].x)q.pop_front();
        while(j < i && a[j].x + max(1ll, d - g) <= a[i].x){
            while(!q.empty() && dp[q.back()] < dp[j])q.pop_back();
            q.push_back(j);
            j++;
        }
        if(q.empty())return ans >= k;
        dp[i] = a[i].s + dp[q.front()];
        ans = max(ans, dp[i]);
    }
    return ans >= k;
}
signed main(){
    cin >> n >> d >> k;
    for(int i{1};i<=n;i++){
        cin >> a[i].x >> a[i].s;
    }
    int l{}, r{1000000000}, ans{-1};
    while(l <= r){
        int mid = (l + r) >> 1;
        if(check(mid)){
            ans = mid;
            r = mid - 1;
        }else{
            l = mid + 1;
        }
    }
    cout << ans;
}
2024/12/13 14:08
加载中...