单调队列
文章平均质量分 58
PoPoQQQ
这个作者很懒,什么都没留下…
展开
-
单调队列模板
肿么感觉自己最近越来越懒了。。。原创 2014-08-22 18:57:49 · 1562 阅读 · 0 评论 -
BZOJ 2276 Poi2011 Temperature 单调队列
题目大意:给定一个序列,每个元素的大小有一个取值范围,求一段区间满足区间内元素可能单调不降 对LL维护一个单调不增的单调队列,一旦新插入的RR值比队头的LL值小就把队头弹掉 这样可以保证单调队列中的元素是合法的极大子区间 然后更新答案就行了 乱写读入优化害死人啊QwQ#include <cstdio> #include <cstring> #include <iostream> #inclu原创 2015-05-15 12:06:08 · 1572 阅读 · 0 评论 -
BZOJ 1136 POI2009 Arc 单调队列
题目大意:给定一个长度为n的序列,求一个长度为k的子序列,使字典序最大 第一个数肯定是在[1,n-k+1]之间选最大的那个 如果有多个选最左侧的 第二个数肯定是在[b1,n-k+2]之间选最大的那个 如果有多个选最左侧的 第三个数肯定是在[b2,n-k+3]之间选最大的那个…… 我们发现区间左右端点都是单调递增的,因此直接用单调队列搞一下就好了 BZ可以这么过 但是去POI官网一原创 2015-04-01 20:37:58 · 1463 阅读 · 0 评论 -
BZOJ 1127 POI2008 KUP 单调队列
题目大意:给定一个矩形,求一个子矩形满足权值和在[k,2k]之间 跪漆子超= = 首先考虑1*n的情况 如果存在[k,2k]之间的点,直接输出 否则如果存在一个区间满足和>=k且任意元素 这个很显然 因为区间内所有元素都 那么我们把这个结论扩展到二维 也是对的 证明:如果存在一个子矩形满足和>=k且所有元素 如果这个子矩形的和 否则这个子矩形的和一定>2k 下面原创 2015-03-25 18:53:06 · 1821 阅读 · 0 评论 -
BZOJ 2500 幸福的道路 树形DP+单调队列
题目大意:给定一棵树,令a[i]为从第i个节点出发的最长链,求a[i]中最长的区间,满足区间内最大值与最小值之差不超过m 读错题害死人,脑残害死人 求a[i]显然是树形DP 考虑从一个点出发的链可以从子节点走,也可以从父节点走 因此我们DP两次,第一次求出从子节点走的最长链,第二次求出从父节点走的最长链,两次取max就是答案 但是直接DP会有问题,因为从父节点走的最长链可能是从自己的子树原创 2015-02-26 16:35:18 · 1760 阅读 · 1 评论 -
BZOJ 3316 JC loves Mkk 二分答案+单调队列
题目大意:给定一个环,要求在这个环上截取长度为偶数且在[L,R]区间内的一段,要求平均值最大 看到环果断倍增 看到平均值最大果断二分答案 看到长度[L,R]果断单调队列 对数组维护一个前缀和,对前缀和维护单调递增的单调队列 每扫过一个数sum[i],将sum[i-L]加入单调队列,再把距离i超过R的点删掉 长度为偶数?对奇数位置和偶数位置分别维护一个单调队列即可 每次找到大于0的原创 2015-01-23 19:26:53 · 2062 阅读 · 0 评论 -
BZOJ 2096 Poi2010 Pilots 单调队列
题目大意:给定一个序列,求一个最长的子串,使最大值与最小值之差不超过k 从左到右枚举右端点,利用单调队列维护当前区间中的最大值和最小值 如果某一时刻当前区间的最大值和最小值之差超过了k,就向右调整左端点直到差小于等于k为止 时间复杂度O(n) #include #include #include #include #define M 3003003 using namespace原创 2015-01-20 12:51:24 · 1864 阅读 · 0 评论 -
BZOJ 1342 Baltic2007 Sound静音问题 单调队列
题目大意:给定一个长度为n的序列,求哪些长度为m的区间满足区间内最大值与最小值之差小于等于c 利用单调队列维护区间内的最大值和最小值- - 硬搞就可以了- - 刷刷水题真爽- - #include #include #include #include #define M 1001001 using namespace std; int n,m,c,a[M]; int q_max[M]原创 2015-01-18 22:33:45 · 1298 阅读 · 0 评论 -
BZOJ 1758 Wc2010 重建计划 树的点分治+二分+单调队列
题目大意:给定一棵树,询问长度在[l,u]范围内的路径中边权的平均值的最大值 01分数规划,首先想到二分答案 既然是统计路径肯定是点分治 每次统计时我们要找有没有大于0的路径存在 那么对于一棵子树的每一个深度i记录一个路径权值和的最大值 然后在这棵子树之前的所有子树的深度可选范围就是[l-i,u-i] 这个窗口是不停滑动的 因此用单调队列维护最大值即可 ↑上面这些网上的题解都说的还是蛮原创 2014-12-11 12:11:13 · 2527 阅读 · 0 评论 -
BZOJ 1023 SHOI2008 cactus仙人掌图 仙人掌DP
题目大意:给定一棵仙人掌,求这棵仙人掌的直径 首先Tarjan缩点双,开vector或者链表记录每个点属于哪些点双,以及每个点双中有哪些点 有些点双可能不是环,我们可以补上一条边看成环,无伤大雅 每次DP时,首先枚举环的根节点以外的点,对这些点所在的其它点双DP一遍 然后令f[x]为以x为根的子仙人掌的所有点和x之间的最大距离 然后我们将环倍增 用单调队列来更新答案 保证决策点和被更新点原创 2015-01-10 16:11:49 · 1692 阅读 · 0 评论 -
BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列
题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每个时间段可以选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每个时间段有m*n个点,n个时间,一定会超时 考虑到一个时间段所有的更新操作都是相同的,我们可以考虑单调队列优化 设队尾为(x,y),新插入的点为(x',y'),那么当Distance( (x,y) , (x',y') ) 四遍单调队原创 2014-10-14 10:43:39 · 2043 阅读 · 0 评论 -
BZOJ 1047 HAOI2007 理想的正方形 单调队列
题目大意:给定一个a*b的矩阵,求一个n*n的子矩阵,使矩阵中的最大值与最小值之差最小 对于每行维护一个单调递减的队列,再弄一个竖着的队列,维护n个格子之内的最大值即可 两遍统计出最大值和最小值 然后得到ans即可 #include #include #include #include #define M 1010 using namespace std; struct abcd{ pai原创 2014-10-24 16:10:26 · 1515 阅读 · 0 评论 -
BZOJ 1122 POI2008 账本BBB 单调队列
题目大意:给定一个由+1+1和−1-1构成的长度为nn的序列,提供两种操作: 1.将某一位取反,花销为xx 2.将最后一位移动到前一位,花销为yy 要求最终p+sumn=qp+sum_n=q,且p+sumi≥0(1≤i≤n)p+sum_i\geq 0(1\leq i\leq n),求最小花销 枚举最终的序列以哪个点开始,那么从这个点往后的最小前缀和可以用单调队列预处理出来 然后贪原创 2015-06-08 16:41:59 · 1898 阅读 · 0 评论