区间划定最小值题解--单调队列
滑动窗口求区间最小值–单调队列
题目如下----转自洛谷
题目描述
一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。
输入输出格式
输入格式:
第一行两个数n,m。
第二行,n个正整数,为所给定的数列。
输出格式:
n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。
输入输出样例
输入样例#1:
6 2
7 8 1 4 3 2
输出样例#1:
0
7
7
1
1
3
【数据规模】
m≤n≤2000000
ai≤3×107a_i\leq 3\times 10^7ai≤3×107
这道题作为一道标准的模板题,做法并不少暴力的话可以直接一层层搜索,但是时间复杂度尾,可以用线段树,rmq等等,但是身为蒟蒻一枚的我都不会,怎么办怎么办?经过了H巨佬的点播,我明白了,原来这玩意可以不用涉及到什么高级的算法,只需要一个简简单单的队列就可以搞定,而且时间复杂度为O(n),是不是很神奇,但是,理想很丰满,现实很骨感,实现这个操作并非易事(对于蒟蒻的我来说),所以特写博客一篇作为纪念。
首先,要找滑动区间的最值,为了避免多次的重复搜索,我们就需要一个状态数组来记录以前的搜索记录,首先想到的就是记录下扫描到每一个点时候的区间最小值,但这样做有一个问题——我们并不知道存下来的最小值是否已经在范围m之外,这样一来,又需要继续扫描来判定上一个元素的最值是否有效,否则重新搜索,这样一来时间复杂的就回到了n方 ,离O(n)的现实还有那么一点远。亡羊补牢,为时不晚,换一个思路,发现如果我们对这种状态有“保质期”的元素存储下标的话,那么就会很容易地判断此元素是否在范围m之外,并且通过下标提取元素也十分方便,那么如何在最小的时间取到最小值呢?我们可以使用单调队列让队列的末端永远都是在保质期内的最小值,保质期过了就把它踢掉,这样一来问题就很好解决了。
附上代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>using namespace std;deque <int> q;
deque <int>::iterator it;int a[12345678],b[12345687]; int main()
{// freopen("testdata.in","r",stdin);int n,k;cin>>n>>k;for(int i=0;i<n;i++)scanf("%d",&a[i]);printf("0\n");for(int i=0;i<n;i++){while(!q.empty() && a[q.back()] >= a[i]) q.pop_back();q.push_back(i); //下标入队 // printf("i: %d q.front: %d\n",i,q.front());b[i] = a[q.front()];if(q.front() <= i-k+1 && i>=k-1)q.pop_front();} for(int i=0;i< n-1;i++)printf("%d\n",b[i]);return 0;}
perfect!
区间划定最小值题解--单调队列相关推荐
- HDU - 3530 Subsequence(单调队列+思维)
题目链接:点击查看 题目大意:给出一段长度为n的序列,现在给出一个m和一个k,必须满足一段连续区间内的最大值与最小值的差值大于等于m并且小于等于k,问满足条件的连续区间的最大长度 题目分析:一开始看到 ...
- [线段树 标记永久化 单调队列] BZOJ 1171 大sz的游戏 BZOJ 2892 强袭作战
很好的题解:http://blog.sina.com.cn/s/blog_76f6777d0101dizp.html "考虑裸的n^2暴力dp. dp[i]=min(dp[j])+1 ( d ...
- 洛谷试炼场 4-8单调队列
layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...
- HDU 4122 Alice's mooncake shop 单调队列优化dp
Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...
- 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MB Submit: 45 Solved: 30 [Submit][Status][Discuss] ...
- HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机
题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...
- Luogu P3594 [POI2015]WIL-Wilcze doły(单调队列)
传送门 题面: 题解: 首先我们要发现,假如右端点为 i i i ,能到达的最远的左端点为 j j j 时,那么 右端点为 i + 1 i+1 i+1 时,能到达的最远左端点一定大于等于 j j j ...
- jzoj3895-数字对【RMQ,GCD,二分答案,单调队列】
正题 题目大意 一个序列aaa 对于[L..R][L..R][L..R]若ak∈[L..R]∣ai∈[L..R]a_k \in [L..R]|a_i\in[L..R]ak∈[L..R]∣ai∈[L ...
最新文章
- [转]struts2处理.do后缀的请求
- 20、Flask实战第20天:Flask上下文
- MySQL之某个表中有近千万数据且CRUD访问缓慢的优化处理
- 8位移位寄存器和优先编码器
- 飞畅科技教你如何选择合适的交换机?
- python import _ssl_Python 3没有名为’_ssl’的模块
- 在Ubuntu18.04上安装Nvidia驱动
- StringUtils 中 isEmpty 和 isBlank 的区别
- EasyRecovery 618年度大促销,走过路过不要错过!
- GMM R语言程序 gmm包的使用
- 三维动画制作软件有哪些?
- #pragma once 用法总结
- No active profile set, falling back to default profiles: default
- Fibonacci Additions (区间加优化)
- 强制卸载阿里云盾(安骑士)监控屏蔽云盾IP检测教程
- meta20 无法安装 google play_【黑科技】安卓手机安装Google Play
- 【ATE-SENT协议】使用LabVIEW采集并解析SENT协议
- 基于英飞凌TLE8242-2L的开关/比例电磁阀驱动电路
- 如果你的网站需要免费的 SVG 插图,一定不要错过 Undraw 这个网站
- 你了解区块链资产吗?新手要如何投资区块链资产?