bzoj 2086: [Poi2010]Blocks 单调栈
来源:互联网 发布:良辰好景知几何 91baby 编辑:程序博客网 时间:2024/05/17 03:51
题意
给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。
总共给出M次询问,每次询问给出的k不同,你需要分别回答。
N <= 1,000,000,M <= 50
分析
蛮巧妙的一道题。
首先很显然的想法就是如果一个序列的平均值大于k则必然满足条件。
那么我们可以将每个数都减去k后求前缀和,问题就变成了对于每一个位置r求一个最小的l,满足s[r]-s[l]>=0.
然后我就不会了。。。
如果可以带log的话做法就比较显然了,但是这题要O(n)
那么我们就可以预处理出一个单调递减的单调栈,然后从后往前枚举r,同时不停地把栈顶弹出就好了。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int N=1000005;int n,m,a[N],id[N];LL sta[N],s[N];int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int main(){ n=read();m=read(); for (int i=1;i<=n;i++) a[i]=read(); while (m--) { int k=read(); for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-k; int top=1;sta[1]=0;id[1]=0; for (int i=1;i<=n;i++) if (sta[top]>s[i]) sta[++top]=s[i],id[top]=i; int ans=0; for (int i=n;i>=1;i--) while (top&&sta[top]<=s[i]) ans=max(ans,i-id[top]),top--; printf("%d",ans); if (m) putchar(' '); } return 0;}
0 0
- BZOJ 2086 [Poi2010]Blocks 单调栈
- bzoj 2086: [Poi2010]Blocks 单调栈
- BZOJ 2086--[Poi2010]Blocks【单调栈】
- [bzoj2086][Poi2010]Blocks 单调栈
- bzoj2086[Poi2010]Blocks 单调栈
- [BZOJ2086][Poi2010]Blocks(单调栈)
- [bzoj2086][Poi2010]Blocks(单调栈)
- bzoj 2086: [Poi2010]Blocks (乱搞)
- bzoj2086[Poi2010]Blocks 单调栈好题
- 2086: [Poi2010]Blocks
- BZOJ 2096([Poi2010]Pilots-单调队列-差值)
- BZOJ 2096 Poi2010 Pilots 单调队列
- BZOJ 2096: [Poi2010]Pilots|单调队列
- bzoj 2096: [Poi2010]Pilots 单调队列
- [BZOJ 2096][Poi2010]Pilots:单调队列
- 单调队列 BZOJ 2096 [Poi2010]Pilots
- BZOJ 2096: [Poi2010]Pilots 单调队列题解
- BZOJ 2096 [Poi2010]Pilots 单调队列
- setsockopt 设置socket
- 错误:无法解析的外部符号"public:virtual struct CRuntimeClass...."
- 《研磨设计模式》读书笔记
- The story of a cow
- 细粒度图像分析
- bzoj 2086: [Poi2010]Blocks 单调栈
- 图文——怎样给GitHub上传本地代码(比如VS项目中的代码等)
- eclipse添加Pydev插件的过程
- Hive连接Mysql---FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
- 在salesforce中按照record type分类编辑详情页配置技巧
- 线材基础知识02——AWG线规
- python爬虫练手之斗图啦
- 这个demo你会编吗
- c++中的消息框messagebox()详细介绍及使用方法