原题链接:http://poj.org/problem?id=2785
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 4000
int A[MAX_N],B[MAX_N],C[MAX_N],D[MAX_N],CD[MAX_N*MAX_N];
void solve(int n)
{
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);
long long res=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int cd=-(A[i]+B[j]);
res+=upper_bound(CD,CD+n*n,cd)-lower_bound(CD,CD+n*n,cd);
}
}
printf("%lld\n",res);
}
int main()
{
//freopen("1.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
scanf("%d",&B[i]);
scanf("%d",&C[i]);
scanf("%d",&D[i]);
}
solve(n);
return 0;
}
其中最为关键的一行:res+=upper_bound(CD,CD+n*n,cd)-lower_bound(CD,CD+n*n,cd);
通过upper_bound()和lower_bound()两个函数的相减,可以求出cd在CD[]数组的个数