单调队列&单调栈
_beginend
这个作者很懒,什么都没留下…
展开
-
bzoj 3721: PA2014 Final Bazarek 单调栈+贪心
题意有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价。 n,m<=1000000,1<=价格<=10^9分析考虑如何从选k个数的状态转移到选k+1个数的状态。可以假如一个偶数,也可以假如两个奇数同时在原来已选的数中删掉一个偶数。而如果这两种情况都不满足,则选k+1个物品的情况无解。 我们可以用四个单调栈来维护这个过程。 一开始WA是因为没有想到若k+1不行的话不代表k+2不行原创 2017-08-10 22:33:46 · 333 阅读 · 0 评论 -
bzoj 2957: 楼房重建 线段树维护单调栈
题意 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线原创 2017-10-08 16:54:14 · 561 阅读 · 0 评论 -
51nod 1488 帕斯卡小三角 单调栈维护凸壳+二分
题意f(1,j)=a[j], 1≤j≤n. f(i,j)=min(f(i-1,j),f(i-1,j-1))+a[j], 2≤i≤n, i≤j≤n. a是一个长度为n的数组。现在有若干个询问,输入x,y,求f(x,y) n,q<=100000分析显然要求的是从第一层某个点(1,s)到(x,y)的最短路径。 yy一下不难发现路径必然是从某个(1,s)走到(x-y+s,s)然后再沿着对角线走到(x原创 2017-10-31 11:20:14 · 478 阅读 · 0 评论 -
bzoj 4237: 稻草人 cdq分治+单调栈+二分
题意JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形; 左下角和右上角各有一个稻草人; 田地的内部(不包括边界)没有稻草人。 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 1<=N<=2*10^5。原创 2017-10-23 19:57:53 · 316 阅读 · 0 评论 -
Codeforces 862F Mahmoud and Ehab and the final stage 线段树+单调栈+分块
题意有n个字符串s[1..n]和q次操作,每次操作是 1 l r表示询问区间[l,r]的所有子区间[a,b]中,lcp(s[a],s[a+1],…,s[b])*(b-a+1)的最大值。 2 x str表示把第x个字符串改成str n,q<=100000,读入的字符串总长不超过100000分析调了快一早上。。。 设lcp[i]=lcp(s[i-1],s[i]),那么lc...原创 2018-03-01 10:27:08 · 273 阅读 · 0 评论 -
bzoj 2806: [Ctsc2012]Cheat 广义后缀自动机+单调队列优化dp
题意给出N个字符串Si和M个字符串Ti,要求对于每一个字符串Si求出一个最大的整数L,使得可以将Si分割成若干个连续的段,其中是某个Ti的子串且长度不小于L的段长的总和不小于|Si|*0.9。分析先对所有Ti建广义sam,然后把Si在sam上跑,求出g[i]表示以i为结尾的前缀最多可以匹配多少长度。 求g[i]具体的方法是,把整个串在sam上跑,设当前匹配到str[p-1]且位于...原创 2018-03-09 21:45:26 · 327 阅读 · 0 评论 -
bzoj 5011: [Jx2017]颜色 单调栈
题意可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色。现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去。删除颜色i可以定义为把所有满足Aj=i的位置j都从序列中删去。然而有些时候删去之后,整个序列变成了好几段,可怜不喜欢这样,于是她想要知道有多少种删去颜色的方案使得最后剩下来的序列非空且连续。例如颜色序列{1,2,3,4,5},删除颜色3后序列变...原创 2018-03-06 08:50:20 · 279 阅读 · 0 评论 -
Codeforces 150E Freezing with Style 点分治+二分答案+单调队列
题意给出一棵n个节点的树,边有边权,长度均为1。问长度在[L,R]之间的所有路径中,中位数最大是多少。 n<=100000分析一开始比较自然的想法是二分答案,然后把不小于mid的边权看做1,其余看做0,然后看是否存在一条路径满足边权和大于0。 显然可以点分治来做。在分治的时候维护最大值可以用带log的数据结构,这样的话复杂度就是O(nlog3n)O(nlog3n)O(nl...原创 2018-04-10 16:48:21 · 468 阅读 · 0 评论 -
uoj #213.【UNR #1】争夺圣杯 单调栈
题意给出一个长度为n的序列a,对于一个m,定义该序列的价值为a[1]到a[m]的最大值+a[2]到a[m+1]的最大值+…+a[n-m+1]到a[n]的最大值。求当m取[1,n]时对应的价值。 n≤106n≤106n\le10^6分析考虑每个元素对答案的贡献。当取最大值时,我们把权值看做第一关键字,下标看做第二关键字,这样每个子序列就唯一对应一个最大值。 对于每个元素,我们找到...原创 2018-04-28 10:32:44 · 323 阅读 · 0 评论 -
bzoj 4476: [Jsoi2015]送礼物 二分答案+单调队列
题意给出n,k,l,r和序列a,要求从a中选一段连续的区间[i,j]出来,使得M(i,j)-m(i,j)/(j-i+k)最大。 M(i,j)表示[i,j]中的最大值,m(i,j)表示[i,j]中的最小值。 Ai< =10^8,N,K< = 50,000分析看到求平均就可以想到二分答案了。 设我们二分的答案为mid 那么对于所有的区间[l,r]显然有M(l,r)−m(l,r)r−l+k<=mi原创 2017-04-25 20:08:12 · 1120 阅读 · 0 评论 -
bzoj 4385: [POI2015]Wilcze doły 单调队列
题意给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。 请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。 1<=d<=n<=2000000,0<=p<=10^16,1<=w[i]<=10^9分析首先考虑没有机会时要怎么做,显然可以用双指针乱搞。 那加上了机会呢?显然也是可以双指针乱搞。 显然随着右端点不断递增,左端点是不递减的。考虑原创 2017-04-24 20:25:28 · 522 阅读 · 0 评论 -
bzoj 2276: [Poi2011]Temperature 单调队列
题意某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内。 求最长的连续的一段,满足该段内可能温度不降。 n<=1000000,-10^9<=li,ri<=10^9分析设i之前的连续若干个区间的最大下界为mx,那么只要r[i]>=mx则i可以接到这若干个后面。 那么我们就用一个单调队列来维护区间下界的最大值就好了。代码#include<iostream>原创 2017-05-15 18:45:33 · 424 阅读 · 0 评论 -
bzoj 2500: 幸福的道路 动态规划+单调栈
题意给出一棵树,每条边都有一个长度。我们规定每个点的权值为从该点开始走过的一条最长的路径的长度。 求一个最长的区间[l,r],使得[l,r]里面点权的最大值和最小值只差不超过m。 n<=1000000分析首先我们要把点权求出来。 那么我们设1为根节点,用两个数组fir[i]和sec[i]维护从节点i开始最长的路径和次长的路径。 第一次先求出起点为i终点在i的子树内的最长路和次长路,第二次再求原创 2016-11-11 16:19:35 · 601 阅读 · 1 评论 -
bzoj 1531: [POI2005]Bank notes 单调队列优化多重背包
题目DescriptionByteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,…, bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.Input第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,…, bn, 1 <= b1 < b2 < … < b n <= 20原创 2016-10-31 21:03:30 · 932 阅读 · 0 评论 -
bzoj 4721: [Noip2016]蚯蚓 单调队列
题意Description本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有n只蚯蚓(n为正整 数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,…,n),并保证所有的长度都是非负整数(即:可 能存在长度为0的蚯蚓)。每一原创 2016-11-30 21:23:54 · 606 阅读 · 0 评论 -
bzoj 2096: [Poi2010]Pilots 单调队列
题意Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值。耍畸形一个人是不行的,于是他找到了你。 0<=k<=2000,000,000,1<=n<=3000,000分析本来想写一波set的,结果发现会RE。。。维护两个单调队列即可。代码#include<iostream>#include<原创 2017-03-23 14:14:25 · 413 阅读 · 0 评论 -
bzoj 2086: [Poi2010]Blocks 单调栈
题意给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。 总共给出M次询问,每次询问给出的k不同,你需要分别回答。 N <= 1,000,000,M <= 50分析蛮巧妙的一道题。首先很原创 2017-05-13 18:32:12 · 318 阅读 · 0 评论 -
LibreOJ #3059.「HNOI2019」序列 单调栈
题意给一个长度为nnn的序列a,每次询问若修改某一个位置,要求找一个长度同样为nnn的单调不降序列b,最小化∑i=1n(ai−bi)2\sum_{i=1}^n(a_i-b_i)^2∑i=1n(ai−bi)2。n,m≤105n,m\le10^5n,m≤105分析首先如果我们只选一个数xxx满足∑(ai−x)2\sum(a_i-x)^2∑(ai−x)2最小,展开后发现这是一个关于xxx...原创 2019-07-01 22:02:02 · 248 阅读 · 0 评论