Problem:
Problem B: Mountain Climbing

Problem

なりよし君は山登りの計画を立てています。計画はとても大切です。高原・盆地が多いのか、峰・窪地が多いのか、山腹があるのか、状況によって用意する荷物も変わってきます。

なりよし君が持っている登山ガイドブックには、今回登山に利用する道の一定の距離毎の標高がスタート地点からゴール地点まで順に書かれています。

ガイドブックに書かれている標高をスタート地点からゴール地点まで順に
a1, a2, a3, ..., aNとし、高原、盆地、山腹、峰、窪地を次のように定義します:

高原

ai-1 < ai = ai+1 = ... = aj > aj+1 (1 < i < j < N)

盆地

ai-1 > ai = ai+1 = ... = aj < aj+1 (1 < i < j < N)

山腹

ai-1 < ai = ai+1 = ... = aj < aj+1 (1 < i < j < N)

もしくは
ai-1 > ai = ai+1 = ... = aj > aj+1 (1 < i < j < N)

峰

ai-1 < ai > ai+1 (1 < i < N)

窪地

ai-1 > ai < ai+1 (1 < i < N)

高原

盆地

山腹

山腹

峰

窪地

あなたは、なりよし君の為に、高原・盆地・山腹・峰・窪地、それぞれの数を計算するプログラムを書くことにしました。

Input

入力は次のような形式で与えられる:

N a1 a2 a3...aN

Nは与えられる標高の数を表す整数である。
aiは標高を表す整数である( 1 ≤ i ≤ N )。それぞれ空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

1 ≤ N ≤ 100000

-100000 ≤ ai ≤ 100000

Output

高原の数、盆地の数、山腹、峰、窪地の数を順番に空白区切りで一行に出力せよ。

Sample Input 1

5 1 2 3 4 3

Sample Output 1

0 0 0 1 0

Sample Input 2

12 10 5 15 15 20 20 12 12 8 3 3 5

Sample Output 2

1 1 2 0 1

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
 
public class Main {
	
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        final int N = sc.nextInt();
        
        int[] heights = new int[N];
        for(int i = 0; i < N; i++){
        	heights[i] = sc.nextInt();
        }
        
        ArrayList<Integer> signed = new ArrayList<Integer>();
        int prev = Integer.MIN_VALUE;
        for(int i = 0; i < N - 1; i++){
        	final int next_diff = heights[i + 1] - heights[i];
        	final int next_sign = next_diff == 0 ? 0 : next_diff / Math.abs(next_diff);
        	
        	if(i == 0){
        		prev = next_sign;
        		continue;
        	}
        	
        	if(prev != next_sign){
        		signed.add(prev);
        		prev = next_sign;
        	}
        }
        if(prev != Integer.MIN_VALUE){
        	signed.add(prev);
        }
        //System.out.println(signed);
        
        int[] counts = new int[5];
        
        for(int i = 1; i < signed.size() - 1; i++){
        	final int prev_sign = signed.get(i - 1);
        	final int curr_sign = signed.get(i);
        	final int next_sign = signed.get(i + 1);
        	
        	if(curr_sign == 0){
        		if(prev_sign == 1 && next_sign == -1){
        			counts[0]++;
        		}else if(prev_sign == -1 && next_sign == 1){
        			counts[1]++;
        		}else {
        			counts[2]++;
        		}
        	}
        }
        
        for(int i = 0; i < signed.size() - 1; i++){
        	final int curr_sign = signed.get(i);
        	final int next_sign = signed.get(i + 1);
        	
        	if(curr_sign != next_sign && curr_sign != 0 && next_sign != 0){
        		if(curr_sign > 0){
        			counts[3]++;
        		}else{
        			counts[4]++;
        		}
        	}
        }
        
        for(int i = 0; i < 5; i++){
        	if(i != 0){
        		System.out.print(" ");
        	}
        	System.out.print(counts[i]);
        }
        System.out.println();
    }
     
}