单调栈
题目链接:
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