
单调栈 || 单调队列
Chester_King
虽千万人,吾往矣。
展开
-
【BZOJ】1628 [Usaco2007 Demo]City skyline 单调栈
题目传送门 诶,这不就是QZOI2017的t2吗?身为蒟蒻的我也就这题是AC的了,其他的题目……难受ing…… 就是一个单调栈,统计当前的节点之前有多少节点的纵坐标比当前节点的纵坐标大。 附上AC代码: #include #include using namespace std; int n,m,que[1000010],len,x,y,ans; inline char nc(){原创 2017-06-02 19:04:52 · 352 阅读 · 0 评论 -
【BZOJ】3956 Count 单调栈+ST表
题目传送门 挺有思想的一题,但如果弄清楚了思路这题还是挺简单的。 首先我们可以发挥一下自己的脑洞,发现所有的好集对不可能相交。 那么我们可以刷两遍单调栈,求出每个点作为区间左端点或右端点的次数。 对于给定区间,我们先找出区间中最大值所在的位置,显然所有的好集对最多以这个位置为左端点或右端点,不可能包含这个位置。 然后问题就转化成了求一个区间的最大值所在的位置,计算以该位置左侧所有位置为左原创 2017-10-02 22:45:50 · 327 阅读 · 0 评论 -
【洛谷】2034 选择数字 DP+单调队列
题目传送门有位大佬叫JZ,他在一次讲课里提到了“正难则反”的原则,虽然他讲的是数位DP,但是这个原则用在这题上也是有非常显著的效果的。题目要求不能有超过kk个连续的数字被选择,求最大权值。那么我们考虑在每kk个数中都要去掉一个数,求去掉的数的最小值。这样的话状态转移方程非常好写:定义f[i]f[i]表示前ii个数去掉一些数的最小值,f[i]=f[j]+a[i],j∈[i−k,i−1]f[i]=f[j原创 2017-10-29 21:12:05 · 454 阅读 · 0 评论 -
【BZOJ】1007 [HNOI2008]水平可见直线 半平面交(单调栈)
题目传送门 半平面交这个名字好可怕啊……但是其实就是一个单调栈。 我们把所有的一次函数按斜率降序排序,设ii为当前函数的编号,sk[]sk[]为单调栈,toptop为栈顶指针。定义calc(x,y)calc(x,y)函数为计算两个一次函数的交点的横坐标。 如果calc(i,sk[top])>=calc(sk[top],sk[top−1])calc(i,sk[top])>=calc(sk[to原创 2018-01-05 19:51:37 · 281 阅读 · 0 评论