思路:用可以组成的所有三角形个数减去不包含圆心的三角形个数,得到包含圆心的三角形个数。
计算方法:不包含圆心的三角形在同一半圆,每个点与圆心连线和极轴顺时针的夹角等于,对能组成不过圆心的三角形的三个点,按逆时针顺序标号为x1,x2,x3;
其满足,即
.枚举起点
从所
种任选两个点作为后两个点,计算出以
为起点的不包含圆心的三角形。
AC代码:
#include <bits/stdc++.h> using namespace std; typedef long long int ll; ll n, l; ll ans = 0; ll dat[2000001]; queue<ll> q; void solve() { cin >> n >> l; for (ll i = 0; i < n; i++) { cin >> dat[i]; } sort(dat, dat + n); for (ll i = 0; i < n; i++) { dat[i + n] = l + dat[i]; } double t = 1.0*l / 2; q.push(dat[0]); ll index = 1; for (ll i = 0; i < n; i++) { ll now = q.front(); q.pop(); while (dat[index] - now < t) { q.push(dat[index++]); } ll m = q.size(); ans += (m - 1) * m / 2; } cout << n * (n - 1) / 2 * (n - 2) / 3 - ans << endl; } int main() { int n__ = 1; // cin >> n__; while (n__--) { solve(); } return 0; }