Description
Input
Output
Sample Input
?? ?
? ? ? ? ? ? ? ? ? ?
? ? ?? ? ?
Sample Output
?? ? ? ? ??
Data Constraint
思路
这题本质是求一个最大的区间平均值>=k
所以我们把序列-k,做一个前缀和,如果sum[j]-sum[i]>=0则区间i+1–j平均值>=k
于是用单调栈维护左端点,枚举右端点即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=1e6+77;
ll n,m,a[maxn],s[maxn],sum[maxn],k;
int main()
{
freopen("blocks.in","r",stdin); freopen("blocks.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
while(m--)
{
ll cnt=1,ans=0; sum[0]=0;
scanf("%lld",&k);
for(int i=1; i<=n; i++)
{
sum[i]=sum[i-1]+a[i]-k;
if(sum[i]<sum[s[cnt]]) s[++cnt]=i;
}
for(int i=n; i>=1; i--)
{
while(sum[i]>=sum[s[cnt]]&&cnt) cnt--;
ans=max(ans,i-s[cnt+1]);
}
printf("%lld ",ans);
}
}