【bzoj2086】 [Poi2010]Blocks
来源:互联网 发布:中国网络排行榜 编辑:程序博客网 时间:2024/06/06 02:20
Description
给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。
总共给出M次询问,每次询问给出的k不同,你需要分别回答。
Input
第一行两个正整数N (N <= 1,000,000)和M (M <= 50)。
第二行N个正整数,第i个正整数表示a[i] (a[i] <= 10^9)。
第三行M个正整数,第i个正整数表示第i次询问的k (k <= 10^9)。
Output
共一行,输出M个正整数,第i个数表示第i次询问的答案。
Sample Input
5 6
1 2 1 1 5
1 2 3 4 5 6
1 2 1 1 5
1 2 3 4 5 6
Sample Output
5 5 2 1 1 0
平均数大于K的区间一定可以,每次减K求前缀和,单调栈维护一下
#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;const int N=1000005;int n,m,a[N],x,top,q[N],ans;long long sum[N];inline void solve(int x){ sum[0]=0; for (int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i]-x; for (int i=1;i<=n;++i) if (sum[q[top]]>sum[i])q[++top]=i; for (int i=n;i>=1;--i){ while (top && sum[i]>=sum[q[top-1]])top--; ans=max(ans,i-q[top]); } printf ("%d",ans);}int main (){ scanf ("%d%d",&n,&m); for (int i=1;i<=n;++i) scanf ("%d",&a[i]); for (int i=1;i<=m;++i){ scanf ("%d",&x); ans=0; solve(x); if (i!=m)printf (" "); else puts(""); } return 0;}
阅读全文
0 0
- BZOJ2086 [Poi2010]Blocks
- BZOJ2086: [Poi2010]Blocks
- BZOJ2086[Poi2010] Blocks
- BZOJ2086 POI2010 Blocks
- 【bzoj2086】 [Poi2010]Blocks
- [bzoj2086][Poi2010]Blocks
- [bzoj2086][Poi2010]Blocks 单调栈
- bzoj2086[Poi2010]Blocks 单调栈
- bzoj2086[Poi2010]Blocks 单调栈好题
- [BZOJ2086][Poi2010]Blocks(单调栈)
- [bzoj2086][Poi2010]Blocks(单调栈)
- POI2010 Blocks
- 2086: [Poi2010]Blocks
- BZOJ 2086 [Poi2010]Blocks 单调栈
- bzoj 2086: [Poi2010]Blocks (乱搞)
- bzoj 2086: [Poi2010]Blocks 单调栈
- BZOJ 2086--[Poi2010]Blocks【单调栈】
- blocks
- c++中的指针、堆、引用、宏
- caffe 源码阅读
- FastDFS分布式文件系统
- 中继注册问题处理
- git 回滚rollback
- 【bzoj2086】 [Poi2010]Blocks
- Python实现读取目录所有文件的文件名并保存到txt文件代码
- 分享一个模拟提交带文件的表单的方法
- 深度优先遍历
- 元素等待————隐式等待
- ViewPager无限轮播实现
- Android SystemUI状态栏添加图标
- springboot之Starter POMs
- 蛇形填数(方块填数+三角形填数)