关于求最长子串,使得最大减最小小于k的问题-以POJ4003为例
2024-09-06 17:23:32
问题
给出一个长度为\(n\)的序列\(a[i]\),有\(m\)次询问,
每次给你一个\(k\),让你求一个最长子串\([l,r]\),使得\(max_l^r\{a_i\}-min_l^r\{a_i\}\leq k\)
思路一
我们显然可以看出这个长度是具有单调性的,于是我们二分答案
\(check\)的方式有以下几种
RMQ
需要\(nlogn\)的时间预处理,空间也要\(nlogn\)
预处理好最大和最小的\(st\)表,\(O(n)\)扫一遍即可
单调队列
时间空间都只需要\(O(n)\)
维护一个单调增的和一个单调减的队列,保持长度即可
不管采用哪种\(check\),思路一的做法都是\(O(nmlogn)\)的
思路二
想一下如果是朴素的暴力,
我们枚举一个必选的右端点\(i\),一定有一个最远的左端点
但是,这个左端点下标是单调不减的!
所以直接单调队列即可。。
证明
很简单,如果右端点是\(i\)的情况下最远的左端点是\(j\)
那么对于右端点\(i',i'>i\),假设左端点\(j'<j\)
因为\(max_j^i\{a_i\}-min_j^i\{a_i\}\leq k\),而\(j\)是最左端点
所以一定有\(max_{j'}^i\{a_i\}-min_{j'}^i\{a_i\}> k\)
根据放缩法,\(max_{j'}^{i'}\{a_i\}-min_{j'}^{i'}\{a_i\}> k\)
O了
最新文章
- Java数据结构——平衡二叉树的平衡因子(转自牛客网)
- 【转载】--仅用 []()+! 就足以实现几乎任意Javascript代码
- SimpleDateFormate的使用
- nyoj 127 星际之门(一)
- memcache实现公共计数器网站
- 聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标
- Linux下查看MySQL的安装路径
- 我的Emacs配置文件
- FtpUtil.java测试 (淘淘商城第三课文件上传)
- 2017-07-04(sudo wc sort)
- php json数据 入库时 转义字符丢失
- Lucene 07 - 对Lucene的索引库进行增删改查
- iOS开发者学习Flutter
- 60道Python面试题&;答案精选!找工作前必看
- linux下ifconfig命令看不到IP centos7——ens33
- 通过DFS求解有向图(邻接表存储)中所有简单回路
- DelegatingFilterProxy作用浅析
- percona-toolkit工具的使用
- Smith Numbers POJ - 1142 (暴力+分治)
- scanf,fscanf,sscanf的区别