一种基于哈希表的解法

与二分的解法相似,把a[i] + b[j]的所有结果放到ab数组里面

不同的是,可以使用哈希表存储从c[i] + d[j]

用m.count(-ab)可以在最好是o(1)的时间复杂度下找到a+b+c+d = 0

但是题目数据好像卡了

哈希表解法最好的时间复杂度是O(n^2), 插入和查找一般是O(1)

在本题里哈希表比排序+二分慢了200ms

下面是ac代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using I128 = __int128;
using PII = pair<int, int>;

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  int n;
  cin >> n;

  int a[n], b[n], c[n], d[n];
  for (int i = 0; i < n; ++i) {
    cin >> a[i] >> b[i] >> c[i] >> d[i];
  }

  vector<int> ab;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      ab.push_back(a[i] + b[j]);
    }
  }

  unordered_map<int, int> m;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      m[c[i] + d[j]]++;
    }
  }

  LL res = 0;
  for (int i : ab) {
    if (m.count(-i)) {
      res += m[-i];
    }
  }

  cout << res;

  return 0;
}