题意

给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。M组询问

n<=1000000,m<=50;

题解

这题一开始想的是二分,但瞟了一眼范围觉得会T但是,觉得可以优化,所以就先写二分了。

结果写挂了(不是T是WA了)然后优化也没来得及想就放弃了。(最后我也不知道怎么挂的,能不能用二分)


我们把所有数减去k再求前缀和。

所以就是求sum[i]-sum[j-1]>0且i-j最大

假设我们已经确定了右端点,我们考虑两个左端点i,j。假设i<j且sum[i]<sum[j],那么j显然是没有用的。

所以我们可以求出一个下标递增,sum递减的序列,用单调栈解决。

然后我们从n到1枚举右端点。

这个端点i对应的左端点j满足sum[i]>=sum[j]且j最小。

然后我们一个一个弹栈,直到sum[j]>sum[i]此时最后一个被弹出栈的下标就是这个端点对应的答案。

具体实现看代码

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const long long N=;
long long n,a[N],m,k,b[N],sum[N],ans,top,stack[N];
void work(){
top=;
stack[]=;
for(long long i=;i<=n;i++){
if(sum[i]<sum[stack[top]])stack[++top]=i;
}
stack[top+]=n;
for(long long i=n;i>=;i--){
while(top&&sum[stack[top]]<=sum[i]){
top--;
}
ans=max(ans,i-stack[top+]);
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=;i<=n;i++){
scanf("%lld",&a[i]);
}
for(long long i=;i<=m;i++){
// cout<<i<<"ashdfkjsdfhsd"<<endl;
scanf("%lld",&k);
ans=;
for(long long i=;i<=n;i++){
b[i]=a[i]-k;
sum[i]=sum[i-]+b[i];
}
work();
printf("%lld ",ans);
}
return ;
}

[POI2010]KLO-Blocks(单调栈)的更多相关文章

  1. bzoj 2086 [Poi2010]Blocks 单调栈

    [Poi2010]Blocks Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 788  Solved: 356[Submit][Status][Dis ...

  2. bzoj2086: [Poi2010]Blocks DP,单调栈

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2086 思路 这就有点妙了 题目意思就是让你求平均数>=k的最长序列 先求出a[i] ...

  3. [bzoj2086][Poi2010]Blocks_单调栈_双指针

    Blocks bzoj-2086 Poi-2010 题目大意:题目链接. 注释:略. 想法:首先,不难发现,如果连续的一段数的平均值不小于输入的k的话,这段数是满足题意的. 所以,我们再次简化一下:将 ...

  4. poj 3415 Common Substrings(后缀数组+单调栈)

    http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Sub ...

  5. POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数

    题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K ...

  6. POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

    Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...

  7. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  8. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  9. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

随机推荐

  1. xBIM 基础06 将STEP物理文件转换为XML

    系列目录    [已更新最新开发文章,点击查看详细]  一.STEP标准简介 STEP,它是Standard for the Exchange of Product model data的缩写.产品数 ...

  2. js小知识 正则表达

    js定义正则表达式有两种方式:普通方式,构造函数方式 正则对象是js的内置对象 正则的属性 正则的方法 js中字符串的方法 一.普通方式(双斜杠//方式):var  reg = /表达式/附加参数 表 ...

  3. cmd 与 网卡(netsh 命令)

    1. 通过命令提示符(cmd)命令连接 Wi-Fi 1.1 连接曾经连接过的 Wi-Fi :: 查看配置的列表(::表示注释) netsh wlan show profile :: 连接 netsh ...

  4. Ubuntu 14.04下从源码安装qt4.x

    转自:http://www.cnblogs.com/crazywangzx/p/3505293.html 1.到官网http://qt-project.org/downloads或者ftp://ftp ...

  5. windows py-faster-rcnn配置

    [原创帖!转载请注明] windows faster-rcnn安装一直会出现各种错误,本人在实验室电脑成功安装后,在自己电脑上同样的安装步骤也成功.所以做个总结,希望对大家有帮助. 一:安装环境 1. ...

  6. springmvc整合mybatis实现商品列表查询

    转载.https://blog.csdn.net/chizhuyuyu/article/details/82180404 https://www.jianshu.com/p/689bdd11bfcc. ...

  7. springmvc两种非注解的处理器适配器

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  8. STM8S103 STVD编译空间不足

    关于text空间(理解为代码空间)不足问题 # 关于.bsct和.ubsct问题(着重参考http://www.waveshare.net/article/STM8-3-1-10.htm) map文件 ...

  9. 基本数据类型(list、tuple)

    1.列表 1.1 定义 li=[1,2,3] 每个元素逗号隔开 list("abc") 迭代 列表是一个容器 => 任意类型 列表是有序的 => 索引 切片 步长 列表 ...

  10. 全国所有省市县地理坐标Json格式

    https://www.cnblogs.com/yzbubble/p/7707129.html