지그재그 히스토그램 나누기

시간 제한1초메모리 제한1024 MB

요약
히스토그램을 양의 정수 너비의 연속한 조각으로 나눠 각 조각의 최대 직사각형 넓이 수열이 지그재그가 되게 하고, 조각 수의 최댓값을 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 스택, 그리디, 분할 정복
정답자
아직 제출이 없습니다

문제

너비가 11이고 높이가 h_1h\_1, ⋯\cdots, h_Nh\_N인 NN개의 직사각형을 순서대로 이어붙여 만든 히스토그램이 주어진다.

히스토그램을 밑변과 수직하게 잘라 몇 개의 조각으로 나누려고 한다. 만들어진 각 조각의 너비는 모두 양의 정수여야 한다. 또한 조각들을 순서대로 나열했을 때 각 조각에 완전히 포함되는 가장 넓이가 큰 직사각형의 넓이 값이 지그재그가 되어야 한다. 이러한 조건을 만족하며 나누어진 조각의 수를 최대화하려 한다.

엄밀히 말해, 당신은 다음과 같은 일을 하는 프로그램을 작성해야 한다.

길이 nn의 수열 \[a_1,⋯ ,a_n]\[a\_{1},\cdots ,a\_{n}]이 지그재그 수열이라는 것은 다음 두 조건 중 하나 이상을 만족하는 것이다.

  • 모든 1≤i\<n1\leq i\<n에 대해, ii가 짝수이면 a_i≤a_i+1a\_{i}\leq a\_{i+1}이고 ii가 홀수이면 a_i≥a_i+1a\_{i}\geq a\_{i+1}
  • 모든 1≤i\<n1\leq i\<n에 대해, ii가 짝수이면 a_i≥a_i+1a\_{i}\geq a\_{i+1}이고 ii가 홀수이면 a_i≤a_i+1a\_{i}\leq a\_{i+1}

히스토그램을 이용해 특정 조건을 만족하는 수열을 다른 수열로 바꿀 수 있다.

  • 바꿀 수열은 길이가 (k+1)(k+1)이고 a_1=0a\_{1}=0, a_k+1=Na\_{k+1}=N을 만족하는 강증가 수열 \[a_1,a_2,⋯ ,a_k+1]\[a\_{1},a\_{2},\cdots ,a\_{k+1}]이다.
  • 바꾸고 난 후의 수열은 길이가 kk이며, \[b_1,b_2,⋯ ,b_k]\[b\_{1},b\_{2},\cdots ,b\_{k}]로 표기하자.
  • 모든 1≤i≤k1\leq i\leq k에 대해, b_ib\_{i}는 (a_i+1)(a\_{i}+1)번째 직사각형부터 a_i+1a\_{i+1}번째 직사각형까지를 순서대로 이어 붙여 만든 히스토그램에서 넓이가 가장 큰 직사각형의 넓이이다.

당신은 위 작업의 조건을 만족하는 가능한 모든 수열 \[a_1,a_2,⋯ ,a_k+1]\[a\_{1},a\_{2},\cdots ,a\_{k+1}]에 대해, 작업을 시행하여 얻어지는 수열 \[b_1,b_2,⋯ ,b_k]\[b\_{1},b\_{2},\cdots ,b\_{k}] 중 가장 길이가 긴 지그재그 수열의 길이를 구해야 한다.

입력

첫째 줄에 양의 정수 NN이 주어진다. (1≤N≤500,0001\le N\le 500\\, 000)

둘째 줄에 NN개의 양의 정수 h_1h\_1, ⋯\cdots, h_Nh\_N이 공백을 사이에 두고 주어진다. (1≤h_i≤1091\le h\_{i}\le 10^{9})

출력

첫째 줄에 문제의 정답을 출력한다.

예제1

  1. 예제 1

    입력
    5
    3 4 5 6 7
    
    예상 출력
    4