Trại hè Hùng Vương 2025
Bài
# | Bài | Điểm |
---|---|---|
1 | GAME | 100 |
2 | ROAD | 100 |
3 | TRAFFIC | 100 |
4 | TABLE | 100 |
5 | COUNT | 100 |
6 | COLOR | 100 |
Thông báo
Thời gian | Tiêu đề | Mô tả |
---|---|---|
Tháng 8 9, 2025, 16:18 | Editorial - COLOR |
Đề bài: Tối ưu hóa đường đi trên cây với điều kiện tô màu đỉnhMô tả bài toánGiả sử có một cây với các đỉnh được tô màu đen hoặc trắng. Một đường đi tối ưu bắt đầu từ đỉnh Mục tiêu là đi qua đường đi chính và đồng thời giải quyết các cây phụ (tô trắng tất cả các đỉnh) sao cho số bước di chuyển là ít nhất. Khi đến một nút trên đường đi chính có kết nối với cây phụ, ta nên giải quyết cây phụ ngay tại thời điểm đó. Thuật toán giải quyết cây phụ
Quy hoạch động
Trường hợp
|
Tháng 8 9, 2025, 16:12 | Editorial - COUNT |
Một đoạn tốt là đoạn có tính chất: tồn tại một số xuất hiện đúng 1 lần, một số khác xuất hiện đúng 2 lần, ..., và một số xuất hiện đúng K lần. Subtask 1:
Subtask 2:
Subtask 3:
Subtask 4:
|
Tháng 8 9, 2025, 16:09 | Editorial - TABLE |
Subtask 1 (30%, m, n ≤ 20; aᵢⱼ ≤ 10⁴) Duyệt tất cả các hình chữ nhật, đếm xem nếu không có số nào xuất hiện 2 lần thì cập nhật kết quả. Độ phức tạp: O(m³n³). Subtask 2 (30%, 20 < m, n ≤ 100; aᵢⱼ ≤ 10⁴) Duyệt khe chặn bởi hàng i và hàng j (ký hiệu: skew(i, j)), trượt sang trái cửa sổ là giao của cột k với skew(i, j). Với mỗi giá trị v, duy trì thông tin cột gần nhất bên phải chứa v (chỉ xét trong skew(i, j)). Các thông tin này cho ta tổng hợp được hình chữ nhật có cạnh trái là cột k có thể mở rộng về bên phải nhiều nhất là đến cột nào, từ đó cập nhật kết quả. Độ phức tạp: O(m³n). Subtask 3 (40%, 100 < m, n ≤ 400) Cải tiến thuật toán ở subtask 2 bằng cách áp dụng quy hoạch động. Với mỗi skew(i, j), gọi f(i, j, k) = t là cột xa nhất về bên phải mà hình chữ nhật có cạnh trái là cột k, cạnh phải là cột t hợp lệ. Công thức quy hoạch động:
Độ phức tạp: ~O(m^2n)~ |
Tháng 8 9, 2025, 15:34 | Editorial - TRAFFIC |
Kí hiệu truy vấn với số tiền ~s~, có thể năng cấp các con đường giữa ~u~ và ~v~ đạt tốc độ nhỏ nhất cực đại là ~Q(u,v,s)~ Subtask 1: Có ~n, q~ đủ nhỏ, với mỗi truy vấn, có thể xây dựng danh sách cạnh trên đường nôi ~u,v~ ký hiệu ~P(u, v)~ trong thời gian ~O(n)~ bằng cách
Sau khi xác định được ~P(u, v)~, tính ~Q(u, v, s)~ bằng 1 trong 2 cách:
ĐPT: ~O(nqlog(n))~ Subtask 2, 3: ~n ,q \le 10^5~ Ta thấy không thể tìm được hết ~P(u, v)~ vì ĐPT là ~O(n)~ cho một bộ Thực hiện TKNP ~Q(u,v,s)~. Với mỗi tốc độ ~x~, ta cần tính nhanh tổng chi phí nâng cấp các cạnh thuộc ~P(u,v)~ mà tốc độ ban đầu ~v_0 < x~. Sử dụng mảng thưa, có thể xác định nhanh ~z=lca(u,v)~ trong ~O(logn)/O(1)~ Ký hiệu ~f(t)~ là tổng chi phí nâng cấp đường từ nút gốc đến t sao cho tốc độ tối thiểu ~\ge x~. Chi phí cho con đường từ ~u~ đến ~v~ là ~f(u) + f(v) - 2f(z)~ Nếu có thể tính ~f(t)~ trong ~O(log n)~ thì chi phí tính ~Q(u, v, s)~ sẽ là ~O(log n log maxV)~. Với mỗi cạnh ~e(u, v, v0, v1, cost)~, tạo hai sự kiện Tiếp theo cần xây dựng cấu trúc dữ liệu cho phép tính toán tổng chi phí nâng cấp các con đường từ gốc (1) đến đỉnh ~t~ tuỳ ý sao cho tốc độ tối thiểu ~≥ x~. Dùng mảng chứa Euler tour của cây (~2n – 2~ phần tử), cần duy trì segment tree quản lý tổng chi phí trên mảng này. Tuy nhiên, mỗi sự kiện (trong ~2n – 2~ sự kiện) cho ta một segment tree, cần gộp chúng lại bằng persistent segment tree. Sắp xếp các sự kiện tăng dần theo tốc độ, segment tree ứng với ~event[i + 1]~ được tính toán theo segment-tree ứng với ~event[i]~ (chỉ sai khác trên đường từ gốc segment tree xuống đúng hai lá). Kết hợp tất cả các kĩ thuật/phân tích trên, tổng chi phí tính toán là ~O(n log n + q log n log maxV)~. Chi phí bộ nhớ:~O(n log n)~, tổng số nút trong persistent segment tree đạt đến ~2(2n – 2) log₂(2n – 2)~, khoảng ~8·10⁶~ nút. |
Tháng 8 9, 2025, 14:38 | Editorial - ROAD |
Mục tiêu của bài toán là giúp Minh đến được đích đúng thời gian, trong các trường hợp đó, tìm thời gian Quang đến N sớm nhất Gán nhãn khoảng cách từ 1 đến tất cả các đỉnh còn lại, ta có mảng Xét trên đồ thị đảo ngược cạnh (tức là chiều của tất cả các cạnh trên đồ thị bị đảo ngược), gán nhãn khoảng cách từ ~K~ và từ ~N~ đến các đỉnh còn lại ta có mảng ~distK~ và ~distN~ Subtask 2: K = N, ta sử dụng Dijkstra từ đỉnh 1, kết quả là ~dist1[n]~ ĐPT: ~O(nlogn)~ Subtask 1, 3: Ta thực hiện Dijkstra từ 3 đỉnh: từ 1 với đồ thị xuôi, ~N, K~ trên đồ thị ngược. Xét các đỉnh ~u~ có
ĐPT: ~O(nlogn)~ |
Tháng 8 9, 2025, 14:24 | Editorial - GAME |
Bài này gồm 3 subtask là 3 bài toán con khác nhau Subtask 1: Sử dụng vòng lặp khi k được sắp xếp không tăng, ta có thể đưa ra nhận xét là các game được chọn để chơi là các game ở đầu với ~k_i \ge k_{i+1}~, và chơi cho đến hết thời gian ~t~ ĐPT: ~O(n)~ Subtask 2: DP Knapsack để chọn game chơi, với trạng thái sau
với ~i, j~ lần lượt là số game và thời gian được sử dụng để chơi/xem đến game thứ ~i~ ĐPT: ~O(n * t)~ Subtask 3: Chiến lược tham lam khi ~k~ được sắp xếp không giảm là chọn các trò chơi liền kề nhau, các trò cọn để chơi luôn nằm sau các trò chỉ tìm hiểu mà không chơi. Giả sử tổng độ hấp dẫn là ~S~, Việt chọn chơi trò ~i~ và không chơi trò ~i+1~ thì tổng độ hấp dẫn là ~S+k_i~. Trong khi vẫn sử dụng thời gian như vậy, nhưng không chơi ~i~, chơi ~i+1~ thì độ hấp dẫn là ~S+k_{i+1}~ Để có độ hấp dẫn tối đa, các game mà không chơi sẽ nằm trước các game được chợn để chơi Nếu bỏ qua ~x~ game đầu tiên, thì thời gian còn lại để chơi là ~t - x * b~. Ta dễ dàng có thể tính được số game chơi là ~y=floor((t - b * x) / a)~. Có thể tính được hấp dẫn trong ~O(1)~ sử dụng prefixsum. ĐPT: ~O(n)~ |