知识点:二分
一道题面非常清爽的题,难度也不是很大,根据数据的规模,知道n的平方可以但是三次方不行,所以可以一半用来枚举,一半用来二分,这样刚刚好,然后就是一个坑的地方,就是我们把两维的数据排序之后用来二分搜索,要注意这里面可能有相等的,到时候假如二分找到了,那么不是加一,而是加上这个数字出现的次数,所以我们一旦找到,还要再进行一次二分,搜索的是原来的数加一,这样就能知道那个数在里面出现多少次了,要加上这个次数
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 4005;
int a[N], b[N], c[N], d[N], rec[N * N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i] >> c[i] >> d[i];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) rec[i * n + j] = -1 * a[i] - b[j];
}
sort(rec, rec + n * n);
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int p = lower_bound(rec, rec + n * n, c[i] + d[j]) - rec;
if (p < n * n && rec[p] == c[i] + d[j]) {
int tt = lower_bound(rec, rec + n * n, c[i] + d[j] + 1) - rec;
ans += tt - p;
}
}
}
cout << ans << endl;
if (t) cout << endl;
}
return 0;
}