题目链接:点击打开链接
题意: 给你四个数组,每个数组抽出一个数,看能形成多少组 a+b+c+d=0,输出组数;
题解:
先求出 a 数组和 b 数组中每个元素的和,之后判断在 c 数组和 d 数组有多少组 -(c+d)=a+b;
运用upper_bound()和lower_bound() ;
详情看:点击打开链接;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set>
#include <stack>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
int a[maxn],b[maxn],c[maxn],d[maxn];
int h[maxn*maxn];
int main()
{
int T; cin>>T;
while(T--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(h,0,sizeof(h));
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
int k=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
h[k++]=a[i]+b[j];
}
}
sort(h,h+k);
int num=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int t=c[i]+d[j];
int x1=upper_bound(h,h+k,-t)-h;
int x2=lower_bound(h,h+k,-t)-h;
num+=(x1-x2);
}
}
cout<<num<<endl;
if(T) cout<<endl;
}
return 0;
}