poj2823_单调队列简单入门】的更多相关文章

题目链接:http://poj.org/problem?id=2823 #include<iostream> #include<cstdio> #define M 1000001 using namespace std; int n,k; int a[M]; int q[M]; int p[M]; void get_min() { ; ; ;i<k-;i++) { while(head<=tail&&a[i]<=q[tail]) --tail; q…
题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说在uestc上也有这题,我过去提交终于过了... 但是poj还是没有过,于是我用数组模拟队列来写,提交还是超时,折腾了一会,把g++改成c++终于5s多过了... 注意如果是直接输出答案的话,如果k=1可能会出错. 代码: #include <cstdio> #include <cstrin…
目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Little Bird #2.1.1 关于题面 #2.1.2 朴素算法 #2.1.3 单调性分析 #2.1.4 码代码 #2.2 P3089 [USACO13NOV]Pogo-Cow S #2.2.1 朴素算法 #2.2.2 单调性分析 #2.2.3 码代码 #3.0 单调队列优化多重背包 #3.1 分析 #3.2 码…
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和队尾都可以进行出队操作,但只有队尾能够进行入队操作. 至于如何来维护单调队列,这里以单调递增队列为例: 1.如果队列的长度是一定的,首先判断队首元素是否在规定范围内,如果不再,则队首指针向后移动.(至于如何来判断是否在制定范围内,一般而言,我们可以给每个元素设定一个入队的序号,这样就能够知道每个元素…
题意:给你长度位n的数组,问每个长度为m的段的最值: 解题思路:这道题是单调队列的入门题: #include<iostream> #include<algorithm> #include<queue> #include<cstdio> #define maxn 1000100 using namespace std; struct node { int val; int pos; }a[maxn]; int que[maxn]; int mn[maxn];…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Give you three integers n, A and B. Then we define Si = Ai mod B and…
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: http://poj.org/problem?id=2823 题意: 给一个数列,找所有连续k个数的最小值和最大值. 算法: 单调队列(入门) *******************************************************************/ #include<…
题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义,这个东西其实是斜率~不知道从哪里看到的证明,这个只有相邻的点才可能最大.所以给定区间找到最大值其实是在相邻的中找.这是这题第一个关键点. 如果一个一个加寻找每一个区间那么复杂度应该是n^2,这里的n大小是1e5,还是不行.然后这个时候思路就是通过单调队列来解决啦~[个人认为更像是个DP]找到某个点…
单调队列是什么呢?可以直接从问题开始来展开. Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数. 数列长度:\(N <=10^6 ,m<=N\) 解法① 很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗最后移一个单元,继续找到k个数中的最大值. 这种方法每求一个f(i),都要进行k-1次的比较,复杂度为$ O(Nk) $. 显然,如果暴力时间复杂度为 $ O(Nm) $ 不超时就怪了. 解法② 还有一种想法是维护一个B…
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入输出格式 输入格式: 输入一共有两行,第一行为n,k. 第二行为n个数(<INT_MAX). 输出格式: 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 这题是单调队列入门题.题意清晰明了,求区间最大(小).…