在此处时,是将前两列的数字进行相加,然后对后两列的数字进行相加,再分别用两个数组分别记录前两列和后两列的数字的结果,对后两列的数组的结果进行单调递增的排序,然后对后两列的数组采用lower_bound和upper_bound去寻找前两列数组的相反数,用一个临时变量存储结果。
#include<iostream>
#include<algorithm>
using namespace std;
int a[10001][10001],n;
int p[5000*5000],q[5000*5000];
void pre(int p[],int x,int y)
{
	int cnt =0 ;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			p[++cnt] = a[x][i] + a[y][j];
		}
	}
} 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[1][i]>>a[2][i]>>a[3][i]>>a[4][i];
	}
	pre(p,1,2);
	pre(q,3,4);
	n = n*n;
	sort(q+1,q+1+n);
	long long cnt =0;
	for(int i=1;i<=n;i++)
	{
		cnt += upper_bound(q+1,q+1+n,-p[i])-lower_bound(q+1,q+1+n,-p[i]);
	}
	cout<<cnt;
	return 0;
}