[POI2010]KLO-Blocks(单调栈)
题意
给出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(单调栈)相关推荐
- POJ2796 Feel Good(单调栈)
题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...
- 【单调栈 前缀和 异或】7.21序列求和
还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...
- 栈与队列7——单调栈结构(进阶问题)
题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...
- 栈与队列7——单调栈结构(初阶问题)
题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...
- 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]
题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...
- 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]
题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...
- [Ahoi2013]差异[后缀数组+单调栈]
链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...
- 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)
整理的算法模板合集: ACM模板 目录 1. NC 打铁的箱子(规律 + 二进制) 2. NC 最优屏障(单调栈 + 前缀和,后缀和) 3. CF993C Careful Maneuvering(bi ...
- 0x11.基本数据结构 — 栈与单调栈
目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...
最新文章
- UVA 10304 Optimal Binary Search Tree
- javascript面向对象学习笔记(一)——继承
- Unix环境高级编程—进程关系
- 两个栈实现一个队列,两个队列实现一个栈
- 2017.11.7 Python 制作EFM32/ AVR批量烧录工具
- OpenCV进阶篇视频
- eureka自我保护时间_SpringCloud Eureka自我保护机制
- 关于.c和.h 和定义变量的问题
- 使用ASP.NET Core开始使用gRPC客户端和服务器
- 为前端工程之崛起而编程!
- mysql修改有外键约束的表结构
- MATLAB图像处理(均值滤波)
- 元宇宙专题001 | 他们居然将元宇宙和心理学写到一起了
- STM32F103的SPI口进行OLED屏的使用
- 项目中涉及到金钱的计算时,数据库字段的使用
- 安装PL-2303驱动
- 深圳物流 inurl php id=,免费快递在线下单接口对接文档-(PHP)
- 慕课网懒懒交流会AngularJs专场学习笔记
- go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
- Chess.com:象棋社区网站每月访问量达 2.8 亿,年收入在 5000 万至 1 亿之间
热门文章
- 恒大为何只是“恒大”,没有“恒强”?
- word图片无法保存问题
- 烤仔万花筒 | “人类群星闪耀时”系列NFT现已在Tspace开售
- 江湖六大门派(按拼音字母顺序,排名不分先后)
- EtherCAT ET1100从站信息接口介绍
- mysql脑裂_如何防止HA集群的脑裂
- PHP版本的大智慧股票API接口demo
- 应用MATLAB求解线性代数题目(二)——矩阵
- 芝麻分760算什么档次,晒晒你们的分数,分数高了有什么用处?
- 全球与中国精密空调市场现状及未来发展趋势