单调队列
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj3314
分析:一眼单调队列。#include<cstdio>#include<cstring>#include<algorithm>//#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long原创 2017-03-16 15:39:14 · 262 阅读 · 0 评论 -
bzoj1047[HAOI2007]理想的正方形 单调队列
题意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。 早就看过这题了,解法其实很简单啦,但是我单调队列经常打错,然后没什么信心去搞这题= =最后想了想还是要锻炼一下自己就来刚了一波。 这应该是一个二维单调队列一样的东西,具体的话就是单调队列求出每一个点往左n个的最小最大值。 然后每一次对于一个n*n的矩形,枚举他的长宽起点(或者原创 2017-10-12 17:23:26 · 297 阅读 · 0 评论 -
bzoj1023 [SHOI2008]cactus仙人掌图 树形DP+单调队列
题意:给一颗仙人掌求直径。 经典好题。 一开始naive的想以为缩点以后直接求,想了想感觉自己是傻子。。块内的根本无法统计。 大概能想到DP求解,但是单调队列真心被震惊到了= = 设f[x],表示以x为起点(从上往下)的最长路径,对于树边/非树边分别转移,树边当让直接转移了,主要是非树边,非树边就是环上边,我只用环上的点更新f[x](x为环上深度最小点),这个需要DP。 树边情况,对于f[原创 2017-10-17 16:43:01 · 271 阅读 · 0 评论 -
JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气 单调队列
题意:给一个数轴,有两种点,每个点都有一个坐标和权值,设第一种为ax,ay,第二种是dx,dy。那么对每一个第二种点,对于所有第一种点,求max(ay−|ax−bx|∗by)max(ay-|ax-bx|*by),n<=2e5.其实很套路的题目,因为单调队列的思想出了点问题= =直接套用斜率优化的那种方法就好了,不然会有问题。。 首先化简式子,由于有绝对值所以拆开,分成左右两部分搞,这个显然。 然原创 2017-09-27 18:05:36 · 365 阅读 · 0 评论 -
5368. 【NOIP2017提高A组模拟9.16】为逝去的公主献上的七重樱 单调队列
简化题意:求mex,有撤销,删除,添加,询问四种操作,n<=1e7. WerkeyTom_FTD大爷的题目。 O(n)明显。亏大发了我,想了半天想出正解但是忘记单调队列怎么维护最小值了,对没错你没有听错我忘记单调队列怎么维护最小值了,发生这种事我很抱歉…想扇自己两耳光。 其实主要是想着要维护原来的队列完整,如果维护一个单调递增那肯定容易啊,问题是要让维护的队列完整,因为我撤销撤的是队头,如果原创 2017-09-16 19:10:03 · 338 阅读 · 0 评论 -
bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
题意:给你一段序列,让你选出一些区间,然后使最合最大但是区间长度不超过k。 一开始想设f[i][j]表示做到第i位,连续选了j个,这明显n^2,但是发现可以优化。j是可以通过单调队列直接算出来的。 然而空间会爆炸(滚动太麻烦)。 所以我们换一个方程式子f[i]=max(f[i],f[j]+sum[j~i])这样维护起来就方便很多了。#include<cstdio>#include<cstri原创 2017-05-20 09:45:14 · 386 阅读 · 0 评论 -
bzoj3126[Usaco2013 Open]Photo 单调队列+dp
又是久违的单队dp。。然而我并没有切出来,真是菜哭了。。 题意:给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点一开始还在想能不能乱搞,因为被包含的区间肯定是没用的,只有相交的区间才有用,问题是哪怕是相交也会有很多种奇葩的情况,感觉分类讨论应该不对。 然后线段树啊啥的都想过就是没想过dp。。 真是傻叉啊我。。 设f[i]表示做到i这个位置,必选i的最大方案数。 那么原创 2017-05-29 16:54:15 · 749 阅读 · 0 评论 -
BZOJ1915 [Usaco2010 Open]奶牛的跳格子游戏
gold组好多单调队列优化的dp啊,感觉自己可以搞个爽了。 用f[i]表示既在去的时候跳到i,又在回来时跳到i-1的最大钱数,再维护一个前缀和s[i],记录从1到i所有钱数大于0的格子的钱数和,可以列出方程 f[i]=max(f[i],f[j]+v[i]+v[i-1]+s[i-2]-s[j]) 然后用单调队列维护一下j就好了。#include<cstdio>#include<cstring>原创 2017-05-18 16:14:39 · 698 阅读 · 0 评论 -
bzoj3048[Usaco2013 Jan]Cow Lineup 单调队列
这题目很好,既能锻炼思维也能锻炼实现技巧。毕竟在某种程度上来说,实现功底要比思维更加重要。 题意比较明显就不说了。 第一眼看到觉得是dp,但是连nk的dp好像都很难打,觉得可能需要特殊的优化技巧? 然后看了看好像可以二分,但是判断非常复杂,不可做。。 然后就蒙蔽了,觉得dp应该没错啊,难道我还要用线段树之类的优化?然而并不可以。。 瞄了一眼发现都是1k左右,觉得应该就是dp没错,然而题解啪原创 2017-05-28 14:38:47 · 364 阅读 · 0 评论 -
bzoj1293: [SCOI2009]生日礼物 单调队列
题意:一条x轴,上面n个,k种珠子,让你找一个最小长度,使得里面有k种珠子存在。单调队列裸题啦,相信各位dalao看见单调队列就知道怎么做了。 只是为什么你们都这么长呢?#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) fo原创 2017-10-15 22:51:58 · 212 阅读 · 0 评论