Free Contest 109 - SEG
Xem dạng PDF
Gửi bài giải
Điểm:
0,80 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch
Bình luận
1. Mô tả lại bài toán
Cho một xâu
Sđộ dàiNchỉ gồm hai kí tự<và>.Cần xây dựng một dãy số nguyên không âm
AgồmN + 1phần tử sao cho:S[i] = '<'thìA[i] < A[i+1]S[i] = '>'thìA[i] > A[i+1]Trong tất cả các dãy thỏa mãn điều kiện trên, hãy tìm tổng nhỏ nhất của các phần tử trong dãy
A.Giới hạn:
|S| ≤ 5 * 10^52. Nhận xét quan trọng
<hoặc>chỉ tạo ra ràng buộc giữa hai phần tử kề nhau.A[i]nên được gán giá trị nhỏ nhất có thể nhưng vẫn thỏa tất cả các ràng buộc.Một vị trí
icó thể đồng thời bị ép:<)>)Do đó, cần xét ảnh hưởng từ cả hai phía.
3. Xử lý ràng buộc từ trái sang phải
Xây dựng mảng
Lvới ý nghĩa:L[i]= giá trị nhỏ nhất màA[i]bắt buộc phải đạt được nếu chỉ xét các dấu<ở bên trái.Cách xây dựng:
L[0] = 0Với mỗi
itừ0đếnN-1:S[i] = '<'thìL[i+1] = L[i] + 1S[i] = '>'thìL[i+1] = 0Lý do:
<liên tiếp buộc dãyAphải tăng dần từng bước tối thiểu là 1.>, ràng buộc tăng từ trái bị ngắt.4. Xử lý ràng buộc từ phải sang trái
Xây dựng mảng
Rvới ý nghĩa:R[i]= giá trị nhỏ nhất màA[i]bắt buộc phải đạt được nếu chỉ xét các dấu>ở bên phải.Cách xây dựng:
R[N] = 0Với mỗi
itừN-1xuống0:S[i] = '>'thìR[i] = R[i+1] + 1S[i] = '<'thìR[i] = 0Lý do:
>liên tiếp buộc dãyAphải giảm dần, nên từ phải qua trái ta phải tăng dần giá trị tối thiểu.5. Ghép hai phía để có nghiệm tối ưu
Tại mỗi vị trí
i, để thỏa đồng thời cả hai phía:A[i] ≥ L[i]A[i] ≥ R[i]Do đó:
Giá trị này là:
Tổng nhỏ nhất cần tìm là:
6. Độ phức tạp
O(N)O(N)7. Cài đặt C++
8. Kết luận
Bài toán được giải bằng tư duy:
Đây là một bài tham lam chuẩn, thường xuất hiện trong các contest về dãy và bất đẳng thức.