![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
二分 尺取 单调栈 队列
涉及上述算法刷的题
嘘……一只bug
逆风的方向更适合飞翔,我不怕千万人阻挡只怕自己投降
——五月天《倔强》
展开
-
HDU 1506 Largest Rectangle in a Histogram 单调栈
题意求直方图最大矩形的面积思路这个题和Passing the Message思路差不多(用单调递减栈维护区间最小值逐渐更新答案。本题是用单调递增栈维护区间最大值逐渐更新答案,用resl[i]记录左边比hei[i]大(含等于)的值的最小下标。遍历到hei[i]的时候,如果栈顶的元素比hei[i]大,就将res[Q.top()]的值更新resl[i], 然后出栈,如果栈顶的值比hei[i]小,就直接入栈。然后再求resr[]数组。resr[i]存的是在i的右边比他大的值的最大下标。代码#prag.原创 2020-09-23 09:54:39 · 71 阅读 · 0 评论 -
HDU Passing the Message 单调栈
Passing the Message题意给出一组数,求每一个数左边(和右边)连续比他小的数中最大的数的位置。思路我们先考虑如何求它的左边连续比它小的数中最大数的位置,这就用到一种简单的数据结构了——单调栈单调栈:单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减),这里我们要用到是单调递减栈(即从栈底到栈顶下标是递增的,但是数据是递减的)顺便说一下,单调递增栈(从栈底到栈顶下标是递增的,但是数据也是递增的)。原理的话看完代码你品你细品.原创 2020-09-22 20:00:14 · 101 阅读 · 0 评论 -
HDU Max Sum of Max-K-sub-sequence 单调队列
Max Sum of Max-K-sub-sequence题意给出一个有N个数字(N<=10^5)的环状序列,让你求一个和最大的连续子序列。这个连续子序列的长度小于等于K。思路借鉴的这位大佬的博客看完思路,结果敲WA了。 然后看了看大佬的代码后有一点不是很理解,遍历的是i,为什么将对sum[i-1]进行操作,最后求tmp的时候,又用到了sum[i], 后来想明白了。假如遍历到了i,用单调队列维护的是区间[sum[i−k],sum[i+1−k]...,sum[i−1]][sum[..原创 2020-09-22 16:18:37 · 132 阅读 · 0 评论 -
HDU-1937 Finding Seats 二维尺取法
Finding Seats题意找一个长方形,长方形中中的座位数量需要大于等于K,求满足条件的最小的长方形的面积思路原先想的是暴力加上剪枝,但是最坏复杂度还是1e8,果断T了。之后想到尺取法,只不过这种尺取法是二维的,只要稍加处理还是很好写的。我们遍历长方形的上下界,然后尺取的求满足条件的最优解。图中i指向长方形的上边界,j指向下边界。l,r指向的都是列,当r右移的时候sum+=3,当l右移的时候sum-=1,根据sum和K的大小比较确定l,r的移动方向当sum<K时,将r右移,否则,将.原创 2020-09-19 08:16:21 · 272 阅读 · 0 评论 -
HDU First One 尺取法
题意有一个整数数组a1,a2,a3,...ana_1,a_2,a_3,...a_na1,a2,a3,...an,定义S(i,j)=ai+ai+1+ai+2+...+ajS(i,j)=a_i+a_{i+1}+a_{i+2}+...+a_jS(i,j)=ai+ai+1+ai+2+...+aj求∑i=1n∑j=in(⌊log2S(i,j)⌋+1)∗(i+j)\sum_{i=1}^n\sum_{j=i}^n(\lfloor log_2S(i,j)\rfloor+1)*(i+j)∑i=1n∑.原创 2020-09-18 16:01:55 · 145 阅读 · 0 评论 -
Vjudge Bound Found 尺取法的好题
题目链接Bound Found题意有N个整数数,可负可正。给一个数t,然后从这N个数中找一个连续的区间,使得这个连续区间和的绝对值最接近t,求出这个连续区间和的绝对值和以及区间的上下界。思路尺取法顾名思义,像尺子一样取一段,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。什么时候可以使用尺取法?我自己的理解是:答案在一段连续的区间内或者是一段连续的区间(可能有多个区间满足情况,题目要求你求出一个最优的区间),一般区间都是从数组的左端原创 2020-09-16 20:30:13 · 164 阅读 · 0 评论 -
HDU 5356 序列变换
思路这个题是最长上升子序列的变形版本,要保证严格递增,需要满足a[j]−a[i]>j−ia[j]-a[i]>j-ia[j]−a[i]>j−i,化简得a[j]−j>a[i]−ia[j]-j>a[i]-ia[j]−j>a[i]−i,所以我们只需要求得序列b的LIS即可(b[i]=a[i]−ib[i]=a[i]-ib[i]=a[i]−i)代码#pragma GCC optimize(2)#include<bits/stdc++.h>using na.原创 2020-09-14 22:28:29 · 137 阅读 · 0 评论 -
HDU 4768 Flyer 二分套二分
题意:给N组数,每组三个数A_i,B_i,C_i,表示K个数A_i, A_i+C_i,A_i+2C_i,…A_i+kC_i (A_i+k*C_i<=B_i, A_i+(k+1)*C_i>B_i).)其实就是一个等差数列,求在这N个数列中出现次数为奇数的那个数和出现的次数,题中数据保证该数只有一个思路:因为数据保证该数只有一个,要是存在,那么所有出现的数出现的次数和一定是个奇数。如果这个是个偶数,就可以直接输出答案了。否则的,我们二分答案,如果check呢?如果出现的数(都小于等于mid)的原创 2020-09-13 17:26:09 · 120 阅读 · 0 评论 -
HDU 5493 Queue 二分外加树状数组
题意:有N个人排成了一队,他们知道自己的身高以及前面(或者后面)有多少人比他们高,要求我们确定这N个人的排队顺序(如果有多种,输出字典序最小的那个)思路:我们首先将这N个人按照高度从小到大排序(当然从大到小也可以),遍历这N个人,依次为他们寻找可能的位置。因为题中给的K可能是前面也可能是后面,所以有两种情况,我们只需取最小的位置即可,这样才能保证最后的答案是最下的字典序。那么位置该如何去找呢?(可以将问题抽象成N个萝卜放N个坑里面)一开始所有人的位置都还没找到,数组t[N]的值都为1,1表示这个坑还原创 2020-09-13 16:56:59 · 84 阅读 · 0 评论