Một bài toán kinh điển
Đề bài
Mô tả
Các bài toán kinh điển trong lập trình thi đấu là những bài thường xuyên xuất hiện trong các kỳ thi lập trình. Bài toán này cũng là một bài rất kinh điển trong lĩnh vực hình học tính toán: xác định những điểm nào bị một đa giác đơn cho trước phủ.
Để phát biểu bài toán chính xác, trước hết ta định nghĩa đa giác. Một đa giác có cạnh được mô tả bởi đoạn thẳng nối với nhau thành một chu trình khép kín. Tức là tồn tại một dãy đỉnh sao cho và với . Như vậy ta có thể xác định một đa giác bằng dãy đỉnh như trên.
Một đa giác đơn là một đa giác không tự cắt, tức là hai đoạn thẳng bất kỳ chỉ có thể gặp nhau tại đầu mút của chúng. Do đó một đa giác đơn bao quanh một miền gọi là miền trong của nó. Một điểm được đa giác đơn phủ khi và chỉ khi nằm trên một cạnh nào đó của hoặc nằm trong miền trong của .
Trong bài này, bạn được cho một đa giác đơn có cạnh, xác định bởi một dãy đỉnh, và điểm trên mặt phẳng. Hãy viết chương trình xác định những điểm nào được đa giác đơn đã cho phủ.
Dữ liệu vào
- Dòng đầu tiên chứa hai số nguyên dương và : số cạnh của đa giác đơn và số điểm.
- Với , dòng thứ chứa hai số nguyên và , trong đó là phần tử thứ của dãy mô tả đa giác.
- Với , dòng thứ chứa hai số nguyên và : điểm cần kiểm tra.
Dữ liệu ra
In ra dòng. Dòng thứ ghi YES nếu được đa giác đơn xác định bởi dãy phủ, ngược lại ghi NO.
Ràng buộc
- .
- .
- Dãy luôn xác định một đa giác đơn.
- với .
- với .
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 3 3 0 0 5 5 5 0 1 1 1 2 2 1 |
YES NO YES |
Điểm nằm trên cạnh nối và ; điểm nằm trong tam giác; điểm nằm ngoài. |
| 4 4 0 0 1 1 2 0 1 5 1 0 1 1 1 2 1 3 |
NO YES YES YES |
Điểm là một đỉnh; và nằm trong đa giác; nằm ngoài. |
Bình luận