TRẠI HÈ HÙNG VƯƠNG HƯỚNG DẪN GIẢI LẦN THỨ XVI – ĐIỆN BIÊN 2022 KỲ THI CHỌN HỌC SINH GIỎI MÔN: TIN HỌC - KHỐI: 11 Ngày thi: 12 tháng năm 2022 Thời gian làm bài: 180 phút (không kể thời gian giao đề) Bài Đối xứng đôi Subtask (30%): Do xâu đối xứng đôi ghép từ hai xâu đối xứng có độ dài nên xâu đối xứng đơi có độ dài chẵn Vì vậy, ta xét xâu có độ dài chẵn kiểm tra xem hai nửa xâu có đối xứng hay khơng Độ phức tạp thuật tốn Subtask (30%): Ta kiểm tra xâu có đối xứng hay khơng với độ phức tạp thời gian cách sử dụng hàm băm thuật toán Manacher Độ phức tạp thuật toán Subtask (40%): Khơng có thêm ràng buộc Do xâu đối xứng đôi ghép từ hai xâu đối xứng có độ dài nên hai nửa hai xâu đối xứng độ dài chẵn lẻ Trường hợp 1: Xâu đối xứng đôi tạo từ hai xâu đối xứng có độ dài lẻ Gọi số xâu đối xứng độ dài lẻ với vị trí trung tâm Chú ý vị trí trung tâm xâu Khi xâu tâm , bán kính đối xứng, hay nói cách khác xâu đối xứng Còn xâu tâm , bán kính khơng đối xứng Chúng ta tính hàm băm thời gian thuật toán Manacher thời gian Bây ta xem hai xâu đối xứng độ dài lẻ tâm tạo xâu đối xứng đôi: a b a c a c Ta nhận thấy điều kiện cần đủ khoảng cách hai tâm phải lẻ Dựa vào điều kiện trên, ta đếm số cặp hai xâu đối xứng độ dài lẻ tạo thành xâu đối xứng đôi sau Đầu tiên tạo mảng chứa xâu đối xứng độ dài lẻ theo thứ tự giảm dần Gọi thành phần thứ nhất, thứ hai phần tử mảng Sau duyệt phần tử mảng , với phần tử thứ ta đếm số phần tử thứ trước mà chúng tạo thành xâu đối xứng đơi Phần tử thứ cần thỏa mãn điều kiện sau: số lẻ, hay nói cách khác khác tính chẵn lẻ; Tóm lại ta cần đếm số phần tử thứ cho khác tính chẵn lẻ nằm đoạn từ đến Để xử lý yêu cầu hiệu quả, ta dùng hai cấu trúc BIT (Binary Indexed Tree): để lưu trữ phần tử với tâm vị trí chẵn lẻ (có thể dùng cấu trúc Segment Tree) Trường hợp 2: Xâu đối xứng đôi tạo từ hai xâu đối xứng có độ dài chẵn Trường hợp làm tương tự trường hợp trước, cụ thể sau Gọi số xâu đối xứng độ dài chẵn với vị trí trung tâm Chú ý vị trí trung tâm xâu Khi xâu tâm , bán kính đối xứng, hay nói cách khác xâu đối xứng Cịn xâu tâm , bán kính khơng đối xứng Chúng ta tính hàm băm thời gian thuật toán Manacher thời gian Bây ta xem hai xâu đối xứng độ dài chẵn tâm tạo xâu đối xứng đôi: a b b a x y y x Ta nhận thấy điều kiện cần đủ khoảng cách hai tâm phải chẵn Dựa vào điều kiện trên, ta đếm số cặp hai xâu đối xứng độ dài chẵn tạo thành xâu đối xứng đôi sau Đầu tiên tạo mảng chứa xâu đối xứng độ dài chẵn theo thứ tự giảm dần Gọi thành phần thứ nhất, thứ hai phần tử mảng Sau duyệt phần tử mảng , với phần tử thứ ta đếm số phần tử thứ trước mà chúng tạo thành xâu đối xứng đôi Phần tử thứ cần thỏa mãn điều kiện sau: số chẵn, hay nói cách khác tính chẵn lẻ; Tóm lại ta cần đếm số phần tử thứ cho tính chẵn lẻ nằm đoạn từ đến Để xử lý yêu cầu hiệu quả, ta dùng hai cấu trúc BIT (Binary Indexed Tree): để lưu trữ phần tử với tâm vị trí chẵn lẻ (có thể dùng cấu trúc Segment Tree) Độ phức tạp thuật toán Bài Tham quan Điện Biên Phủ Ta xây dựng mơ hình đồ thị cho toán Địa điểm tương ứng với đỉnh Con đường hai chiều nối hai địa điểm với thời gian di chuyển chúng tương ứng với cạnh vô hướng nối hai đỉnh với trọng số Bài tốn trở thành tìm đường đỉnh cho qua tất đỉnh (theo thứ tự tùy ý) với độ dài đường nhỏ Chú ý đến đỉnh , ta di chuyển tức thời đến đỉnh thăm trước Subtask (10%): Trong subtask ta có , tức có địa điểm hấp dẫn Vì việc di chuyển tức thời subtask khơng có ý nghĩa Nhiệm vụ subtask đơn giản tìm độ dài đường ngắn từ đỉnh đến đỉnh Ta sử dụng thuật tốn Dijkstra để tìm câu trả lời Độ phức tạp thuật tốn Subtask (10%): Trong subtask ta có , tức địa điểm hấp dẫn Dễ dàng nhận thấy câu trả lời trọng số khung nhỏ đồ thị Chúng ta tính trọng số khung nhỏ thuật toán Kruskal Độ phức tạp thuật toán Subtask (20%): Trong subtask kích thước liệu nhỏ, nên ta duyệt hoán vị thăm địa điểm hấp dẫn Khi từ địa điểm hấp dẫn đến địa điểm hấp dẫn tiếp theo, ta chọn đường ngắn Sau thăm địa điểm hấp dẫn, ta bổ sung gán lại trọng số cạnh từ địa điểm hấp dẫn đến địa điểm hấp dẫn thăm Trong trình duyệt, ta lưu lại đường có độ dài nhỏ Độ phức tạp thuật toán Subtask (20%): Ta xây dựng đồ thị gồm đỉnh đỉnh hấp dẫn đồ thị ban đầu Giữa hai đỉnh có cạnh (vơ hướng) nối với trọng số độ dài đường ngắn chúng Dùng thuật toán Floyd-Warshall để tính tốn độ dài đường ngắn cặp đỉnh hấp dẫn Áp dụng thuật toán Kruskal để tìm khung nhỏ đồ Khi câu trả lời tốn trọng số khung cộng với độ dài đường ngắn từ đỉnh đến đỉnh hấp dẫn gần Độ phức tạp thuật tốn Subtask (20%): Ta cải tiến thuật toán subtask việc tính độ dài đường ngắn đỉnh hấp dẫn, cách áp dụng thuật toán Dijkstra cho đỉnh xuất phát đỉnh hấp dẫn Độ phức tạp thuật toán Subtask (20%): Khơng có thêm ràng buộc Đầu tiên với đỉnh , ta tính gồm hai thơng tin: khoảng cách từ đỉnh đến đỉnh hấp dẫn (ứng với địa điểm hấp dẫn) gần đỉnh hấp dẫn gần Để thực cơng việc này, ta tạo thêm đỉnh giả nối đỉnh với đỉnh hấp dẫn cạnh có trọng số Sau áp dụng thuật tốn Dijkstra từ đỉnh Thực tế cài đặt, ta không cần sinh đỉnh giả , cần sửa đổi bước khởi tạo thuật toán Dijkstra gán nhãn tất đỉnh hấp dẫn với đẩy chúng vào hàng đợi ưu tiên Tiếp theo ta xây dựng đồ thị bao gồm đỉnh hấp dẫn Với cạnh đồ thị cũ, gọi tương ứng đỉnh hấp dẫn gần đỉnh Nếu ta thêm cạnh vơ hướng vào đồ thị nối hai đỉnh với trọng số Sau ta tính trọng số khung nhỏ đồ thị thuật toán Kruskal Cuối câu trả lời toán cộng với trọng số khung nhỏ tìm Độ phức tạp thuật toán Bài Điện toán đám mây Subtask (4%): Câu trả lời đơn giản Độ phức tạp Subtask (6%): Số giá trị khác nhỏ Chi phí tác vụ số chương trình nhân với giá trị lớn nhớ chương trình tác vụ Do tác vụ gồm chương trình có dung lượng nhớ việc chúng tác vụ hay chia chúng thành nhiều tác vụ cho chi phí Mặt khác, tốt tác vụ gồm chương trình Do giới hạn subtask số giá trị khác nhỏ , nên từ nhận xét ta có thuật tốn tham lam sau Ta chia chương trình thành tác vụ, cho chương trình tác vụ có dung lượng nhớ Khi câu trả lời tốn Độ phức tạp Subtask (10%): Để giảm chi phí cho tác vụ, ta cần nhóm chương trình theo thứ tự dung lượng nhớ giảm dần vào tác vụ Do ta xếp giảm dần tác vụ gồm đoạn chương trình liên tiếp Từ subtaks trở đi, ta giả thiết xếp giảm dần Bây ta chia chương trình theo thứ tự giảm dần nhớ, vào tác vụ Việc giống ta đặt vách ngăn vào vị trí hai phần tử liên tiếp mảng , hai vị trí khơng đặt q vách ngăn Số cách Công việc tốn chia kẹo Euler Ta duyệt tất cách chia chương trình vào tác vụ Mỗi cách tính số chi phí phải trả lưu lại chi phí nhỏ số cách Độ phức tạp Subtask (20%): Sắp xếp theo thứ tự giảm dần Gọi chi phí tối thiểu để chia chương trình thành khơng q tác vụ Chú ý số tác vụ chi phí cao, nên cần phải sử dụng nhiều tác vụ Vì câu trả lời toán với , chắn phải sử dụng tác vụ Ta có cơng thức truy hồi tính sau: với ; với Độ phức tạp Subtask (20%): Nhận thấy với cố định, giảm dần tăng Vì ta loại bỏ tham số sử dụng tìm kiếm nhị phân để tính chi phí tối thiểu chương trình với tối đa tác vụ Kỹ thuật xử lý gọi “Aliens trick” (vì biết đến qua tốn “Aliens” IOI 2016) Kỹ thuật cịn có tên gọi khác như: “tối ưu lambda (lambda optimization)” hay “nhân tử Lagrange (Lagrange multipliers)” Trong kỹ thuật “Alien trick”, với tác vụ ta cộng thêm vào chi phí Việc tăng/giảm làm giảm/tăng giữ nguyên số tác vụ giải pháp tối ưu Điều cho thấy tìm kiếm nhị phân giá trị nhỏ để tạo giải pháp tối ưu có khơng nhiều tác vụ Gọi chi phí nhỏ chương trình với tối đa tác vụ nó, tác vụ cộng thêm chi phí Ta có: Ngồi lưu trữ mảng bổ trợ khác số tác vụ tối thiểu mà sử dụng Cuối ý chi phí cho chương trình cần điều chỉnh, tác vụ nhiều cho giá trị Độ phức tạp Subtask (20%): Ta tối ưu thuật toán subtask theo hướng khác Ta biến đổi: Ta tính nhanh kỹ thuật bao lồi (convex hull trick) tập đường thẳng với hệ số góc , hệ số tự truy vấn Theo giả thiết hệ số góc có thứ tự giảm dần nên đường thẳng xếp theo hệ số góc giảm dần Vì kĩ thuật bao lồi, đường thẳng đưa vào bao lồi cần theo thứ tự hệ số góc giảm dần nên ta không cần phải xếp lại đường thẳng Hơn cần ý có hai đường thẳng hệ số góc, nên ta cần phải xử lý trường hợp Mặt khác truy vấn theo thứ tự tăng dần , nên thay tìm kiếm nhị phân cho truy vấn, ta cần tìm kiếm lần để trả lời cho tất truy vấn Độ phức tạp Subtask (20%): Khơng có thêm ràng buộc Sử dụng hai kỹ thuật tối ưu áp dụng subtask subtask Ta tiếp tục tối ưu thuật toán subtaks sau Biến đổi: Để tính nhanh , ta sử dụng kỹ thuật bao lồi (convex hull trick) tập đường thẳng với hệ số góc , hệ số tự truy vấn Độ phức tạp - HẾT -