# Lời giải bài Beads
## Tác giả: Phạm Quang Minh, I2023
## 1. Tóm tắt đề
Cho dãy $a$ có $n$ $(1 \le n \le 10^5)$ phần tử, hãy tìm dãy con tăng dài nhất bằng cách thêm phần tử $a_i$ hiện tại theo 1 trong 2 cách:
1. thêm phần tử $a_i$ vào đầu dãy con tăng hiện tại.
1. thêm phần tử $a_i$ vào cuối dãy con tăng hiện tại.
## 2. Nhận xét bài toán
- Ta có thể thấy được để thực hiện 1 trong 2 cách thêm phần tử cũng tương đương với việc tìm dãy con tăng dần dài nhất hoặc dãy con giảm dần dài nhất.
- Để thực hiện cả 2 thao tác, ta có nhận xét là ta sẽ chọn 1 dãy con tăng dài nhất và 1 dãy con giảm dài nhất sao cho chúng không giao nhau.
- Để tìm 1 dãy con tăng và 1 dãy con giảm không giao nhau, ta cần tìm một dãy con tăng dần bắt đầu với phần tử có giá trị là $x$ và một dãy con giảm bắt đầu với phần tử có giá trị là $x-1$ $(1 \leq x \leq 10^9)$.
- Để giảm số lượng $x$ cần xét, ta nhận xét là chỉ có thứ tự tương đối của các phần tử $a_i$ quan trọng, từ đó ta có thể sử dụng [kĩ thuật nén số](https://usaco.guide/silver/sorting-custom), khi đó chỉ cần xét $x$ $(1 \leq x \leq n)$.
- Độ phức tạp: $O(n^2)$
## 3. Cải tiến
- Để tìm dãy con tăng hoặc giảm dần một cách nhanh chóng, ta có thể sử dụng [cấu trúc dữ liệu hoặc chặt nhị phân](https://cp-algorithms.com/sequences/longest_increasing_subsequence.html).
### Độ phức tạp: $O(n \times log(n))$
### Code mẫu: [Link](https://ideone.com/RCIbEC)
### Tag: Dynamic Programming, Data Structure