在此处时,是将前两列的数字进行相加,然后对后两列的数字进行相加,再分别用两个数组分别记录前两列和后两列的数字的结果,对后两列的数组的结果进行单调递增的排序,然后对后两列的数组采用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;
}

京公网安备 11010502036488号