分两边来枚举。减少时间复杂度。
__int64在Uva上面用不了。。。
代码很容易看懂。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn = 4005;
int A[Maxn], B[Maxn], C[Maxn], D[Maxn];
int AB[Maxn * Maxn];
int main()
{
// freopen("in.txt", "r", stdin);
long long int ans = 0;
int t, n, i;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d%d%d%d", &A[i], &B[i], &C[i], &D[i]);
int count = 0;
for(i = 0; i < n; i++)
for(int j = 0; j < n; j++)
AB[count++] = A[i] + B[j];
sort(AB, AB + count);
ans = 0;
for(i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
int cd = C[i] + D[j];
ans += upper_bound(AB, AB + count, -cd) - lower_bound(AB, AB + count, -cd);
}
}
printf("%lld\n", ans);
if(t)
printf("\n");
}
return 0;
}