PVOI14_4 - Chữ M

Tags: binary-index-tree, dp, sortings, binary-search, data-structure

Problem

https://vn.spoj.com/problems/PVOI14_4

https://oj.vnoi.info/problem/PVOI14_4

Giáng Sinh sắp đến, thầy Minh quyết định trang trí khu du lịch của mình. Trước cửa khu du lịch, có một hàng gồm N cây, đánh số từ 1 đến N theo chiều từ trái sang phải, cây thứ i có độ cao h_i. Thầy Minh quyết định chọn một số cây để treo mỗi cây một đèn lồng đỏ trên ngọn, sao cho khi nhìn từ vịnh Hạ Long vào, các đèn lồng sẽ tạo thành một chữ M.

Chữ M được định nghĩa như sau: Đó là một dãy các cây, khi xét từ trái sang phải, có thể chia thành 4 phân đoạn, trong đó độ cao các dãy trong đoạn đầu tiên tăng nghiêm ngặt, trong đoạn thứ hai giảm nghiêm ngặt, trong đoạn thứ ba tăng nghiêm ngặt và trong đoạn thứ tư giảm nghiêm ngặt.

Tức là, có một dãy các chỉ số a_1 < a_2 < ... < a_i < b_1 < b_2 < ... < b_j < c_1 < c_2 < ... < c_k < d_1 < d_2 < ... < d_l sao cho:

  • Dãy h_a1, h_a2, ..., h_ai là dãy tăng nghiêm ngặt, và i ≥ 2.
  • Dãy h_ai, h_b1, ..., h_bj là dãy giảm nghiêm ngặt, j ≥ 1.
  • Dãy h_bj, h_c1, ..., h_ck là dãy tăng nghiêm ngặt, k ≥ 1.
  • Dãy h_ck, h_d1, ..., h_dl là dãy giảm nghiêm ngặt, l ≥ 1.

Độ hoành tráng của chữ M là số lượng đèn lồng tạo thành chữ M.

Yêu cầu: Hãy tìm độ hoành tráng lớn nhất của một chữ M mà thầy Minh có thể tạo được.

Input

  • Dòng 1 chứa số nguyên dương N ≤ 50,000
  • Dòng 2 chứa N số nguyên dương không vượt quá 10^9
  • Dữ liệu đảm bảo tồn tại ít nhất một cách treo đèn. Các số trên một dòng của file input được ghi cách nhau bởi dấu cách.

Output

Ghi ra độ hoành tráng lớn nhất của một chữ M có thể có.

Example

Input
15
1 20 15 30 25 20 15 40 30 20 10 5 4 6 8

Output
12

Tutorial

Bài này bản chất là QHĐ : Gọi F[i][j] là chiều dài dài nhất đến đèn thứ i với đèn i là đèn cuối cùng trong dãy phần thứ j. (1 <= i <= n && 1 <= j <= 4).

Dễ thấy F[i][1] = max(F[j][1]) với j < ia[j] < a[i] (tương tự dãy con tăng dài nhất)

Còn F[i][j] (j > 1) thì có hai cách lựa chọn, thứ nhất nó là bắt đầu của dãy j-1 (ví dụ dãy đang lên tới j thì i là đèn bắt đầu đi xuống, và ngược lại). Trường hợp thứ hai là nó tiếp tục của một dãy j (ví dụ đang xuống thì tiếp tục xuống, tương tự như đi lên).

Do đó F[i][j] = max(F[k][j], F[k][j-1]) (k < ia[k] thỏa mãn a[i]) (dãy 2, 4 thì a[k] > a[j], do đang đi xuống hoặc bắt đầu xuống, còn dãy 3 thì a[k] < a[j]).

Tất cả những điều trên đều dễ dàng thực hiện bằng BIT. Do đó bài toán có

ĐPT : O(NlogN).

Chú ý khi cập nhật những phần tử đầu tiên của một dãy 2, dãy 3, dãy 4. (F[2][i_bắt_đầu] >= 3, F[3][i_bắt_đầu] >= 4, ...)


Submission

PVOI14_4.cpp