最小值最大,果断二分
二分之后就是裸题了
遇到第一个不满足二分值的必须要加了,而且是从这个位置开始加
维护用差分就好了
看代码吧,这个没什么好说的
#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 ;
}
京公网安备 11010502036488号