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
Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài
Lưu ý: các bạn không nhập, xuất dữ liệu bằng file kể cả khi đề bài có yêu cầu. Đọc, ghi dữ liệu được thực hiện ở stdin và stdout.
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.