原题链接:https://vjudge.net/problem/UVA-1152
分类:二分法
备注:中途相遇法
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e3+5;
typedef long long ll;
int T,n,ans,t;
ll a[4][maxn];
int main(void){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%d",&T);while(T--){scanf("%d",&n);if(t++)printf("\n");vector<ll>num; ans=0;for(int j=0;j<n;j++)for(int i=0;i<4;i++)scanf("%lld",&a[i][j]);for(int i=0;i<n;i++)for(int j=0;j<n;j++)num.push_back(a[0][i]+a[1][j]);sort(num.begin(),num.end());for(int i=0;i<n;i++)for(int j=0;j<n;j++){ll tmp=-a[2][i]-a[3][j];int pos=lower_bound(num.begin(),num.end(),tmp)-num.begin();for(int k=pos;k<num.size();k++)if(num[k]==tmp)ans++;else break;}printf("%d\n",ans);}return 0;
}