trang chủ / đề bài / shoearea / lời giải

Diện tích đa giác đơn

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Hướng tiếp cận

Bài toán hỏi diện tích đa giác đơn cho bởi danh sách đỉnh có thứ tự. Công cụ kinh điển là công thức Shoelace (công thức dây giày).

Nhận xét quan trọng

  1. Với đa giác đơn P có các đỉnh (x1,y1),(x2,y2),…,(xN,yN) theo thứ tự (cùng chiều hoặc ngược chiều kim đồng hồ), ta có:

    2·S(P)=|∑i=1N(xi·yi+1−xi+1·yi)|

    với quy ước (xN+1,yN+1)≡(x1,y1).

  2. Tổng bên trong có thể âm (nếu các đỉnh liệt kê theo chiều kim đồng hồ). Vì vậy bắt buộc lấy giá trị tuyệt đối.

  3. Đề yêu cầu in ra 2S chứ không phải S — vì 2S luôn là số nguyên còn S có thể là số bán nguyên.

Thuật toán

đọc N
đọc các điểm (x[i], y[i]), i = 0..N-1
s = 0
for i = 0..N-1:
    j = (i + 1) mod N
    s += x[i] * y[j] - x[j] * y[i]
in ra |s|

Độ phức tạp

  • Thời gian: O(N).
  • Bộ nhớ: O(N) để lưu các đỉnh.

Lưu ý cài đặt

  • Với N≤105 và |x|,|y|≤106, mỗi tích xi·yj có thể tới 1012, và tổng có thể tới N·4·1012=4·1017 — vượt phạm vi 32-bit. Phải dùng long long.

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