当我们同心在一起
题目描述
平面上有 n 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 n个点之中?
样例输入 1
5
0 0
-2 0
0 2
-1 1
2 0
样例输出 1
2
解析: 数学题,可以采用枚举任意三个点计算外心,但复杂度为n^3,提交不了
这里用到外心的性质: 外心是三角形三边垂直平分线的交点, 所以三个点到外心等距。
所以这里我们假设每个点都是外心,算出其他n-1个点和它的距离,若一个值出现t次,(3个点组成一个三角形),则可以组成个三角形。等于n*(n-1)(n-2)/6;
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX_N = 3000;
long long x[MAX_N], y[MAX_N];
long long d[MAX_N];
long long sqr(long long v) {return v * v;}
void solve() {
int n,num;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%lld%lld", &x[i], &y[i]);
}
long long an = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
d[j] = sqr(x[i] - x[j]) + sqr(y[i] - y[j]);
}
sort(d, d + n);
for(int j = 0, k; j < n; j = k)
{
for(k = j; k < n && d[k] == d[j]; k++);
num = k - j;
an += num * (num - 1) * (num - 2) / 6;
}
}
printf("%lld\n", an);
}
int main() {
solve();
}