思路:
我们考虑直角三角形的性质
一条直角边转90°的斜率等于另一条直角边的斜率
那我们就可以枚举直角顶点,把每条边转90°的斜率用map存起来,最后统计一下就行了
c o d e code code
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int MAXN = 1510;
int n, sum;
map<pair<int, double>, int> q;
struct node {
int x, y;
}a[MAXN];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d%d", &a[i].x, &a[i].y);
for(int i = 1; i <= n; i ++) {
int x = 0, y = 0;
for(int j = 1; j <= n; j ++)
if(i != j) a[j].x -= a[i].x, a[j].y -= a[i].y;
for(int j = 1; j <= n; j ++) {
if(i != j) {
int x1 = -a[j].y, y1 = a[j].x, g;
double k = (y1 - y) * 1.0 / (x1 * 1.0 - x * 1.0);
if(k < -1000000000 || k > 1000000000)
k = 10000000000.0;
if(x1 > 0 && y1 >= 0) g = 1;
if(x1 <= 0 && y1 > 0) g = 2;
if(x1 < 0 && y1 <= 0) g = 3;
if(x1 >= 0 && y1 < 0) g = 4;
q[make_pair(g, k)] ++;
// cout<<g<<' '<<k<<endl;
}
}
// cout<<"-----------"<<endl;
for(int j = 1; j <= n; j ++) {
if(i != j) {
int x1 = a[j].x, y1 = a[j].y, g;
double k = (y - y1) * 1.0 / (x * 1.0 - x1 * 1.0);
if(k < -1000000000 || k > 1000000000)
k = 10000000000.0;
if(x1 > 0 && y1 >= 0) g = 1;
if(x1 <= 0 && y1 > 0) g = 2;
if(x1 < 0 && y1 <= 0) g = 3;
if(x1 >= 0 && y1 < 0) g = 4;
sum += q[make_pair(g, k)];
// cout<<g<<' '<<k<<endl;
}
}
// cout<<endl<<sum<<endl;
q.clear();
// cout<<endl<<"----------"<<endl<<"__________"<<endl;
for(int j = 1; j <= n; j ++)
if(i != j) a[j].x += a[i].x, a[j].y += a[i].y;
}
printf("%d", sum);
return 0;
}