5396. Blocks
Description
Input
Output
Sample Input
?? ?
? ? ? ? ? ? ? ? ? ?
? ? ?? ? ?
Sample Output
?? ? ? ? ??
Data Constraint
分析:因为操作次数不限,因此若一段区间平均值超过?,即为一组合法解
将??减去?,用???记录前缀和,区间变成和>= ?即为合法
??表示右端点为?的合法区间中最小的左端点
?? = ???(?) (? <= ? <= ? 且 ???[?] − ???[? − ?] >= ?)
显然如果存在? < ?而且???[?] < ???[?],则?为无用决策
单调栈维护决策即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1000005
using namespace std;
int k,n,m;
int ans,t;
long long sum[N];
int a[N],q[N];
int main(){
freopen("blocks.in","r",stdin);
freopen("blocks.out","w",stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
while(m--)
{
scanf("%d", &k);
ans = 0;
t = 1;
for (int i = 1; i <= n; i++)
{
sum[i] = sum[i - 1] + a[i] - k;
if (sum[i] < sum[q[t]]) q[++t] = i;
}
for(int i = n; i >= 1; i--)
{
while (t && sum[i] - sum[q[t]] >= 0) t--;
if (i - q[t + 1] > ans) ans = i - q[t + 1];
}
printf("%d ", ans);
}
}