单调栈

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5662

好久没打题了。。。。准研一狗最近在各种恶补操作系统and编译原理

这题肯定不算难题,但也不算太简单。

枚举k,复杂度n,每个k内部循环对应的复杂度n/k,根据调和级数(n+n/2+n/3+ ```` + n/n)=nlogn

那问题也就来了,如何在O(n/k)的时间内求出min(A[l*k], A[(l+1)*k], ``` , A[r*k])

首先想到可以枚举min,假设第i个数是min,因为A[i] > 0, 所以只要L[i], R[i]范围尽可能大就行。

利用单调栈即可,压入A[i]时,比A[i]大的都出栈,这样可以找到前面第一个比A[i]小的元素,每个元素仅入栈一次,

不影响复杂的,正的做一遍求L[i],反的做一遍求R[i]即可。

View Code

网上不用栈来模拟单调栈的方法好评:

View Code
原文地址:https://www.cnblogs.com/zhazhalovecoding/p/5382179.html