题意

给出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]此时最后一个被弹出栈的下标就是这个端点对应的答案。

具体实现看代码

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const long long N=1000100;
 8 long long n,a[N],m,k,b[N],sum[N],ans,top,stack[N];
 9 void work(){
10     top=1;
11     stack[1]=0;
12     for(long long i=1;i<=n;i++){
13         if(sum[i]<sum[stack[top]])stack[++top]=i;
14     }
15     stack[top+1]=n;
16     for(long long i=n;i>=1;i--){
17         while(top&&sum[stack[top]]<=sum[i]){
18             top--;
19         }
20         ans=max(ans,i-stack[top+1]);
21     }
22 }
23 int main(){
24     scanf("%lld%lld",&n,&m);
25     for(long long i=1;i<=n;i++){
26         scanf("%lld",&a[i]);
27     }
28     for(long long i=1;i<=m;i++){
29     //    cout<<i<<"ashdfkjsdfhsd"<<endl;
30         scanf("%lld",&k);
31         ans=0;
32         for(long long i=1;i<=n;i++){
33             b[i]=a[i]-k;
34             sum[i]=sum[i-1]+b[i];
35         }
36         work();
37         printf("%lld ",ans);
38     }
39     return 0;
40 }

转载于:https://www.cnblogs.com/Xu-daxia/p/9444163.html

[POI2010]KLO-Blocks(单调栈)相关推荐

  1. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  2. 【单调栈 前缀和 异或】7.21序列求和

    还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...

  3. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

  4. 栈与队列7——单调栈结构(初阶问题)

    题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...

  5. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  6. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  7. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  8. 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)

    整理的算法模板合集: ACM模板 目录 1. NC 打铁的箱子(规律 + 二进制) 2. NC 最优屏障(单调栈 + 前缀和,后缀和) 3. CF993C Careful Maneuvering(bi ...

  9. 0x11.基本数据结构 — 栈与单调栈

    目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...

最新文章

  1. UVA 10304 Optimal Binary Search Tree
  2. javascript面向对象学习笔记(一)——继承
  3. Unix环境高级编程—进程关系
  4. 两个栈实现一个队列,两个队列实现一个栈
  5. 2017.11.7 Python 制作EFM32/ AVR批量烧录工具
  6. OpenCV进阶篇视频
  7. eureka自我保护时间_SpringCloud Eureka自我保护机制
  8. 关于.c和.h 和定义变量的问题
  9. 使用ASP.NET Core开始使用gRPC客户端和服务器
  10. 为前端工程之崛起而编程!
  11. mysql修改有外键约束的表结构
  12. MATLAB图像处理(均值滤波)
  13. 元宇宙专题001 | 他们居然将元宇宙和心理学写到一起了
  14. STM32F103的SPI口进行OLED屏的使用
  15. 项目中涉及到金钱的计算时,数据库字段的使用
  16. 安装PL-2303驱动
  17. 深圳物流 inurl php id=,免费快递在线下单接口对接文档-(PHP)
  18. 慕课网懒懒交流会AngularJs专场学习笔记
  19. go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
  20. Chess.com:象棋社区网站每月访问量达 2.8 亿,年收入在 5000 万至 1 亿之间

热门文章

  1. 恒大为何只是“恒大”,没有“恒强”?
  2. word图片无法保存问题
  3. 烤仔万花筒 | “人类群星闪耀时”系列NFT现已在Tspace开售
  4. 江湖六大门派(按拼音字母顺序,排名不分先后)
  5. EtherCAT ET1100从站信息接口介绍
  6. mysql脑裂_如何防止HA集群的脑裂
  7. PHP版本的大智慧股票API接口demo
  8. 应用MATLAB求解线性代数题目(二)——矩阵
  9. 芝麻分760算什么档次,晒晒你们的分数,分数高了有什么用处?
  10. 全球与中国精密空调市场现状及未来发展趋势