POJ 2785 折半搜索
https://vjudge.net/problem/POJ-2785
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<set> #include<algorithm> #include<map> #define maxn 4005 typedef long long ll; using namespace std; int n; ll a[maxn],b[maxn],c[maxn],d[maxn]; ll cd[maxn*maxn];//记录c和d数组的和的数组 int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { cin>>a[i]>>b[i]>>c[i]>>d[i]; } //把c和d的和组成cd数组 for(int i=0;i<n;i++) for(int j=0;j<n;j++){ cd[i*n+j]=c[i]+d[j]; } sort(cd,cd+n*n); ll res=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { //cout<<"a"<<endl; ll ans=-(a[i]+b[j]); res+=upper_bound(cd,cd+n*n,ans)-lower_bound(cd,cd+n*n,ans); // 返回第一个大于等于ans的位置 返回第一个大于ans的位置 //最后返回相等ans的位置 } cout<<res<<endl; } return 0; }