Hướng dẫn cho LQDOJ Cup 2023 - Round 6 - Cut Cake


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: bin9638

Subtask 1 <Duyệt trâu>

  • Vì bánh có dạng đa giác lồi nên mỗi đường thẳng sẽ chỉ cắt bánh ở tối đa 2 điểm.
  • Với mỗi truy vấn ta duyệt qua tất cả các cạnh của bánh để xem đường thẳng \(x = l\) và \(x = r\) cắt bánh ở những điểm nào và tính diện tích.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n * q)\)

Subtask 2 <Duyệt trâu>

  • Ta sắp xếp \(l, r\) của các truy vấn và các cạnh dọc (vuông góc với trục hoành) của bánh theo hoành độ.
  • Ta duyệt theo hoành độ tăng dần, tưởng tượng có một đường thẳng vuông góc với trục hoành chạy từ trái sang phải, với mỗi hoành độ ta đếm xem với mỗi tung độ thì nó đã cắt qua các cạnh dọc của bánh bao nhiêu lần, diện tích của phần bánh tại hoành độ đó sẽ là số tung độ cắt qua lẻ lần.
  • Với mỗi truy vấn ta chỉ cần in ra tổng kết quả của các tung độ từ \(l\) đến \(r\).
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n * 10^5)\)

Subtask 3 <Duyệt trâu>

  • Với mỗi truy vấn, ta sẽ duyệt các cạnh theo chiều được cho ở đầu vào (theo chiều kim đồng hồ), sau đó ta sẽ thêm các giao điểm của các cạnh đó với đường thẳng \(x = l\) và \(x = r\) lần lượt theo thứ tự duyệt, chú ý là xét đường thẳng \(x = l\) hay \(x = r\) trước sẽ theo chiều của cạnh.
  • Cuối cùng danh sách các giao điểm sẽ là vùng bánh được cắt ra với các đỉnh theo chiều kim đồng hồ.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O(n * q)\)

Subtask 4 <Sắp xếp theo hoàng độ>

  • Ta sắp xếp \(l, r\) của các truy vấn và các cạnh của bánh theo hoành độ.
  • Khi đó ta duyệt lần lượt các đường thẳng, ta sẽ dùng một con trỏ chạy theo để xác định các cạnh mà đường thẳng đó cắt.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O((n+q) * log)\)

Subtask 5 <Cấu trúc dữ liệu>

  • Cải tiến từ subtask \(2\), tuy nhiên vì \(n\) và tọa độ các điểm lớn nên ta sẽ phải nén thành các đoạn hoành độ và tung độ, đồng thời dùng cấu trúc dữ liệu Segment Tree để cập nhật.
  • Độ phức tạp thời gian tổng thể cách này sẽ là \(O((n+q) * log)\)

Subtask 6 <Công thức>

  • Với mỗi truy vấn \(L, R\), ta dựng hai đường thẳng vuông góc với trục tọa độ, loại bỏ phần bên trái của \(L\) và phần bên phải của \(R\). Như vậy ta sẽ có một đa giác mới có \(m\) đỉnh \(p_0, p_1, p_2, ..., p_{m-1}\).

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.