题意:
四个集合,要求每个集合中选出一个数字,四个数字相加为0,问四个数字相加为零的次数有几次
分析:
先把A+B的和存到sum数组里,然后再从中找-(c+b)出现的个数。求长度为n的有序数组a中的数k的个数num:num=upper_bound(a,a+n,k)-lower_bound(a,a+n,k);
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=4005;
int T,n;
int A[maxn],B[maxn],C[maxn],D[maxn],sum[maxn*maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
int c=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
sum[c++]=A[i]+B[j];
sort(sum,sum+c);
long long ans=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
ans+=upper_bound(sum,sum+c,-C[i]-D[j])-lower_bound(sum,sum+c,-C[i]-D[j]);
}
}
printf("%lld ",ans);
if(T)
printf(" ");
}
}