poj 2785
折半枚举(双向搜索)
//24716k, 6479ms
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 4005;
int n;
int A[MAX_N], B[MAX_N], C[MAX_N], D[MAX_N];
int CD[MAX_N * MAX_N];
void solve() {
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("in.txt", "r", stdin);
scanf("%d", &n);
for(int i=0; i<n; i++) {
scanf("%d%d%d%d", &A[i], &B[i], &C[i], &D[i]);
}
solve();
fclose(stdin);
return 0;
}