思路:用可以组成的所有三角形个数减去不包含圆心的三角形个数,得到包含圆心的三角形个数。
计算方法:不包含圆心的三角形在同一半圆,每个点与圆心连线和极轴顺时针的夹角等于,对能组成不过圆心的三角形的三个点,按逆时针顺序标号为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;
}
京公网安备 11010502036488号