最小值最大,果断二分

二分之后就是裸题了

遇到第一个不满足二分值的必须要加了,而且是从这个位置开始加

维护用差分就好了

看代码吧,这个没什么好说的

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+10;
int n,m,w;
int a[maxn],b[maxn];
bool isok(int mid)
{
    int ans=0;
    for(int i=0;i<=n+w;i++)    b[i]=0;
    for(int i=1;i<=n;i++)
    {
        b[i]+=b[i-1];
        if( a[i]+b[i]<mid )
        {
            int f = mid-a[i]-b[i];
            b[i]+=f, b[i+w]-=f;
            ans+=f;
        }
        if( ans>m )    return false;
    }
    if( ans<=m )    return true;
    return false;
}
signed main()
{
    cin >> n >> m >> w;
    for(int i=1;i<=n;i++)    cin >> a[i];
    int l=0,r=2e9,mid,ans=0;
    while( r>=l )
    {
        mid = l+r>>1;
        if( isok(mid) )    l=mid+1,ans=mid;
        else    r=mid-1;
    }
    cout << ans ;
}