給定 N (≤8000) 個頂點的簡單多邊形(不自交,無三點共線),計算積分 ∬_P (x + y) dA,結果保留兩位小數。T ≤ 500 測試用例。
積分可分解:
∬_P (x + y) dA = ∬_P x dA + ∬_P y dA
由重心公式:
x_G = (∬_P x dA) / Area, y_G = (∬_P y dA) / Area
∴ 積分 = Area × (x_G + y_G)
固定頂點 0,將多邊形分解為 N-2 個三角形:ΔP₀Pᵢ₋₁Pᵢ (i=2..N-1)。
double x[8005], y[8005];
int main() {
int T, n; cin >> T;
while (T--) {
cin >> n;
for (int i = 0; i < n; ++i) cin >> x[i] >> y[i];
double total_area = 0, integral = 0;
for (int i = 2; i < n; ++i) {
// 向量叉積求有向面積
double cross = (x[i-1]-x[0])*(y[i]-y[0]) - (y[i-1]-y[0])*(x[i]-x[0]);
double area = cross / 2.0;
total_area += area;
// 重心
double gx = (x[0] + x[i-1] + x[i]) / 3.0;
double gy = (y[0] + y[i-1] + y[i]) / 3.0;
integral += (gx + gy) * area;
}
// 面積可能為負(頂點順序),積分同號
if (total_area < 0) integral = -integral;
cout << fixed << setprecision(2) << integral << '\n';
}
}
// 輸入:
2
4
4 -1
-1 4
-6 -1
-1 -6
4
0 0
10 0
10 10
0 10
// 輸出:
-100.00
1000.00