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