大概题意是这样的:从每一列选一个数字,让他们的和为零
思路:暴力枚举前两列的数字和(设为X),然后把后两列所有的组合值排序,用lower_bound和upper_bound来查找有多少个-X
代码如下:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int A[4100],B[4100],C[4100],D[4100];
int CD[4100*4100];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
CD[i*n+j]=C[i]+D[j];
}
}
int ans=0;
sort(CD,CD+n*n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int x=-A[i]-B[j];
ans+=upper_bound(CD,CD+n*n,x)-lower_bound(CD,CD+n*n,x);
}
}
printf("%d\n",ans);
}