給定 N 個不重合點,求能形成多少個梯形(至少一組對邊平行)。
梯形 ⇔ 兩條平行線段(不共線、不等長)。
C(cnt,2) 為候選梯形struct Line {
double len, k, y; // k=atan2(dy,-dx)∈[0,π), y=截距標識
};
bool cmpk(Line a, Line b) { return a.k < b.k; }
bool cmpl(Line a, Line b) { return a.len < b.len; }
bool cmpy(Line a, Line b) { return a.y < b.y; }
sort(lines, lines+L, cmpk);
for (每個斜率分組) {
ans += C(cnt, 2); // 同斜率總對數
// 扣除共線重疊
sort(group, cmpl);
for (每個長度分組) ans -= C(cnt, 2);
// 扣除等長
sort(group, cmpy);
for (每個截距分組) ans -= C(cnt, 2);
// 加回重疊且等長
sort(group, cmpy_then_len);
for (每個截距+長度分組) ans += C(cnt, 2);
}
atan2 避免垂直線無限斜率c/b 或 c/a,垂直線用 x 截距fabs(a-b) < 1e-9