题目给四个数组ABCD,
Ai + Bj + Cx + Dy = 0
count++
四层循环的爆掉
分别枚举A B 和C D
在二分搜索判断
#include <stdio.h>
#include <stdlib.h>
#define N 5010
#define Max 17000010
int num1[Max], num2[Max], a[N][4];
int cmp(const void *a, const void *b){
return (*(int *)a - *(int *)b);
}
int main(){
int cas, n;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < 4; j++)
scanf("%d", &a[i][j]);
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
num1[cnt] = a[i][0] + a[j][1];
num2[cnt++] = a[i][2] + a[j][3];
}
qsort(num2, cnt, sizeof(num2[0]), cmp);
int count = 0;
for (int i = 0; i < cnt; i++) {
int left, right, mid;
left = 0;
right = cnt - 1;
while (left < right) {
mid = (left + right) / 2;
if (num2[mid] >= (-num1[i]))
right = mid;
else
left = mid + 1;
}
if (num2[left] == -num1[i]) {
for (int j = left; j < cnt; j++) { //left 可能大于cnt 排除
if (num2[j] == num2[left])
count++;
else
break;
}
}
}
printf("%d\n", count);
if (cas)
printf("\n");
}
return 0;
}