POJ2559单调栈

来源:互联网 发布:新手c#编程题及答案 编辑:程序博客网 时间:2024/05/20 23:38


import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Stack;import java.util.StringTokenizer;public class Main {public static void main(String args[]) {new Task().solve() ; }}class Task{InputReader in = new InputReader(System.in) ;PrintWriter out = new PrintWriter(System.out) ;void solve(){    int n ;     while((n = in.nextInt()) != 0){    int[] high = new int[n+1] ;    int[] left = new int[n+1] ;    int[] right = new int[n+1] ;    for(int i = 1 ; i <= n ; i++) high[i] = in.nextInt() ;    Stack<Integer> stk = new Stack<Integer>() ;    for(int i = 1 ; i <= n ; i++){    while(! stk.isEmpty() && high[stk.peek()] >= high[i]) stk.pop() ;    left[i] = stk.isEmpty() ? 1 : stk.peek() + 1 ;    stk.push(i) ;    }    stk.clear() ;    for(int i = n ; i >= 1 ; i--){    while(! stk.isEmpty() && high[stk.peek()] >= high[i]) stk.pop() ;    right[i] = stk.isEmpty() ? n : stk.peek() - 1 ;    stk.push(i) ;    }    long res = 1L * high[1] * (right[1] - left[1] + 1) ;    for(int i = 2 ; i <= n ; i++)    res = Math.max(res , 1L * high[i] * (right[i] - left[i] + 1) ) ;    out.println(res) ;    }out.flush() ;}}class InputReader {        public BufferedReader reader;        public StringTokenizer tokenizer;            public InputReader(InputStream stream) {            reader = new BufferedReader(new InputStreamReader(stream), 32768);            tokenizer = new StringTokenizer("");        }            private void eat(String s) {            tokenizer = new StringTokenizer(s);        }            public String nextLine() {            try {                return reader.readLine();            } catch (Exception e) {                return null;            }        }            public boolean hasNext() {            while (!tokenizer.hasMoreTokens()) {                String s = nextLine();                if (s == null)                    return false;                eat(s);            }            return true;        }            public String next() {            hasNext();            return tokenizer.nextToken();        }            public int nextInt() {            return Integer.parseInt(next());        }            public long nextLong() {            return Long.parseLong(next());        }            public double nextDouble() {            return Double.parseDouble(next());        }            public BigInteger nextBigInteger() {            return new BigInteger(next());        }        }    


0 0
原创粉丝点击