[Buổi 18][Heap & Hàng đợi ưu tiên][ADV] Bài 1: Điền mảng theo đoạn ưu tiên
Điền mảng theo đoạn ưu tiên
Bối cảnh và bài toán
Ban đầu mảng a[1..n] toàn 0. Ở bước v=1..n, chọn đoạn 0 liên tiếp dài nhất; nếu có nhiều đoạn cùng độ dài, chọn đoạn có l nhỏ nhất. Với đoạn [l,r], đặt a[(l+r)/2]=v (chia nguyên xuống), khiến đoạn tách thành tối đa hai đoạn con chưa điền.
Yêu cầu
In mảng sau n bước.
Input
- Một dòng chứa
n.
Output
In n giá trị của mảng cuối.
Ràng buộc
1 <= n <= 2 * 10^5
Chấm điểm
| Subtask | Điểm | Điều kiện | Official tests |
|---|---|---|---|
| S1 | 20% | n <= 100 | 01–04 |
| S2 | 30% | n <= 5000 | 05–10 |
| S3 | 50% | Không có ràng buộc bổ sung | 11–20 |
Ví dụ 1
Input
5
Output
2 4 1 3 5
Giải thích. Đầu tiên chọn [1,5] đặt 1 ở 3; sau đó [1,2] đặt2 ở1; [4,5] đặt3 ở4; ...
Ví dụ 2
Input
3
Output
2 1 3
Giải thích. Chọn [1,3] trước, rồi hai đoạn đơn [1,1] và [3,3] theo l nhỏ hơn.
Thông tin bài tập
| Thuộc tính | Giá trị |
|---|---|
| Mã bài | DSA-M05-B18-ADV01 |
| Buổi | B18 |
| Loại bài | ADVANCED |
| Mức độ khó | Khó (Hard) |
| Thời gian làm bài khuyến nghị | 70 phút |
| Time limit | 2 giây |
| Memory limit | 256 MB |
| Tổng điểm | 100 |
| Chuẩn ngôn ngữ tham chiếu | C++11 trở lên |
| Yêu cầu bổ sung | Decision Note |
Nguồn: Phỏng theo Codeforces 1353D – Constructing the Array.
Comments