原题链接:
poj2785 4 Values whose Sum is 0
题意:给出元素都为n的4个数组A,B,C,D,要从每个数组中各取一个数,求这四个数和为0的次数,一个数列有多个相同数字时,当作不同数字看待
//思路先枚举C,D的和排序,再枚举A,B的和在C,D和中进行折半查找C+D=-(A+B)的部分
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 4000 + 5;
//输入
int n;
int A[MAX_N], B[MAX_N], C[MAX_N], D[MAX_N];
int CD[MAX_N * MAX_N]; //存C、D中的所有和
int main(){
int n, i, j;
scanf("%d", &n);
for(i = 0;i < n;i ++)
scanf("%d%d%d%d", &A[i], &B[i], &C[i], &D[i]);
for(i = 0;i < n;i ++){ //枚举C、D的和存入CD中
for(j = 0;j < n;j ++)
CD[i * n + j] = C[i] + D[j];
}
sort(CD, CD + n * n); //对和排序
long long res = 0;
for(i = 0;i < n;i ++){
for(j = 0;j < n;j ++){
int cd = -(A[i] + B[j]);
//取出C和D中和为cd的部分(CD中>cd的第一个位置与>=cd的第一个位置相减)
res += upper_bound(CD, CD + n * n, cd) - lower_bound(CD, CD + n * n, cd);
}
}
printf("%lld\n", res);
return 0;
}