Đếm điểm nguyên trong đa giác

Đề bài

Mô tả

Cho một đa giác đơn (simple polygon) gồm N đỉnh có toạ độ nguyên, được liệt kê theo thứ tự dọc theo biên (cùng chiều kim đồng hồ hoặc ngược chiều kim đồng hồ). Đa giác đơn nghĩa là các cạnh không tự cắt nhau (ngoại trừ tại các đỉnh chung kề nhau).

Hãy đếm số điểm nguyên (điểm có cả hai toạ độ là số nguyên) nằm bên trong nghiêm ngặt đa giác — tức là không nằm trên biên của đa giác.

Dữ liệu vào

  • Dòng đầu chứa số nguyên N — số đỉnh.
  • N dòng sau, mỗi dòng chứa hai số nguyên xi,yi — toạ độ đỉnh thứ i.

Dữ liệu ra

In ra một số nguyên duy nhất — số điểm nguyên nằm bên trong nghiêm ngặt đa giác.

Ràng buộc

  • 3≤N≤105.
  • |xi|,|yi|≤106.
  • Đa giác đảm bảo là đa giác đơn; không có hai đỉnh liên tiếp trùng nhau.
  • Kết quả có thể tới ~4·1012, nên cần dùng kiểu số nguyên 64-bit.

Ví dụ

Input Output Giải thích
4
0 0
4 0
4 3
0 3
6 Hình chữ nhật 4×3. Diện tích A=12, số điểm biên B=14, điểm trong I=12−14/2+1=6.
3
0 0
5 0
0 4
6 Tam giác vuông. A=10, B=5+1+4=10, I=10−10/2+1=6.
3
0 0
1 0
0 1
0 Tam giác nhỏ. 2A=1, B=3, I=(1−3)/2+1=0.

Ghi chú

Có thể dùng định lý Pick: với đa giác đơn có các đỉnh nguyên, A=I+B/2−1, trong đó A là diện tích, I là số điểm nguyên bên trong, B là số điểm nguyên trên biên.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0