直接暴力复杂度太高,可以先把A、B的每个元素相加组合存到数组M,C、D的每个元素相加组合也存到一个数组N。
然后把C、D的组合从小到大排序,然后枚举M数组每个元素Mi,二分查找N数组元素有几个-Mi 即可。
POJ 2785和这题一样,就是输入的时候没有T。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <assert.h>
using namespace std;
int c[16001111], d[16001111];
int main()
{
//freopen("test0.in", "r", stdin);
//freopen("test0.out", "w", stdout);
int T, n, a[4000][4];
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < 4; j++)
{
scanf("%d", &a[i][j]);
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
c[i*n + j] = a[i][0] + a[j][1];
d[i*n + j] = a[i][2] + a[j][3];
}
}
sort(d, d+n*n);
int cnt = 0;
for(int i = 0; i < n * n; i++)
{
int left, right, mid;
left = 0;
right = n * n - 1;
while(left < right)
{
mid = (left + right) / 2;
if(d[mid] >= (-c[i]))
{
right = mid;
}
else
{
left = mid + 1;
}
}
if(d[left] == -c[i])
for(int i = left; i < n * n; i++)
{
if(d[i] == d[left])
{
cnt++;
}
else
{
break;
}
}
}
printf("%d\n", cnt);
if(T)putchar('\n');
}
return 0;
}