NC110615(Present )

感受

思路



#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int n, m, w;
int a[maxn];
ll sum[maxn];
int lowbit(int x){
    return x & (-x);
}
void add(int i, int x){
    while(i <= n){
        sum[i] += x;
        i += lowbit(i);
    }
}
ll getsum(int i){
    ll ans = 0;
    while(i){
        ans += sum[i];
        i -= lowbit(i);
    }
    return ans;
}
bool check(ll v){
    for(int i = 1; i <= n; i++){
        sum[i] = 0;
    }
    for(int i = 1; i <= n; i++){
        add(i, a[i] - a[i - 1]);
    }
    ll num = 0;
    for(int i = 1; i <= n; i++){
        ll k = getsum(i);
        if(k < v){
            k = v - k; num += k;
            if(num > m) return false;
            add(i + w, -k);
            add(i, k);
        }
    }
    return true;
}
int main(){
    ll l, r, mid; l = 1; r = 2e9;
    scanf("%d%d%d", &n, &m, &w);
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    while(r - l > 1){
        mid = (l + r) / 2;
        if(check(mid)){
            l = mid;
        }
        else{
            r = mid;
        }
    }
    printf("%lld\n", l);
    return 0;
}
全部评论

相关推荐

11-14 16:09
门头沟学院 Java
Java抽象带篮子:可以看看我的苍穹外卖话术帖子和八股笔记帖子
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务