定义:单调栈由单调和栈两个性质确定,是指在栈中从栈顶到栈底保持单调特性(递增或者递减),利用单调栈的特性,我们可以求出:对于一个数列中的元素是s[i],s[i]左边第一个小于(或大于)s[i]的元素的位置。
简单证明(以单调递减栈为例):
对于i,当stack[top] >= s[i] 时,stack[top]会出栈,剩余栈内元素都小于stack[top],所以stack[top-1]一定是 (小于s[top]&&与i的距离最短)的元素。这样依次出栈直到stack[top] < s[i] 或 栈中只剩一个初始边界元素 时栈顶元素的位置就是左边第一个小于s[i]的位置。
例HDU1506
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
while(true) {
int n = scan.nextInt();
if(n == 0) break;
long s[] = new long[100000+10];
for(int i = 1 ; i <= n ; i++) {
s[i] = scan.nextLong();
}
int l[] = new int[100000+10];
int top = 0;
int stack[] = new int[100000+10];
for(int i = 1 ; i <= n ; i++) {
while(top != 0 && s[i] <= s[stack[top]]) {
top--;
}
l[i] = stack[top];
stack[++top] = i;
}
int r[] = new int[100000+10];
top = 0;
stack[0] = n+1;
for(int i = n ; i >= 1 ; i--) {
while(top != 0 && s[i] <= s[stack[top]]) {
top--;
}
r[i] = stack[top];
stack[++top] = i;
}
long Max = 0;
for(int i = 1 ; i <= n ; i++) {
Max = Math.max(Max, (r[i]-l[i]-1)*s[i]);
}
System.out.println(Max);
}
}
}