ABC_234_ex sol

georegyucjr發表於2024-08-28

題意

在平面直角座標系中找出所有\(dist(i, j) \leq k\)的點對個數\(\leq 4\times 10^5\)

\(1 \le n \le 2\times 10^5\)
\(1 \le k \le 1.5\times 10^5\)

hint

分塊

不是ds

sol

考慮將網格分割,每\(k\)\(k\)列分一格。注意到分完塊以後對於一個點\((i, j)\)所在的塊\(B_{(i, j)}\),和他距離\(\leq k\)的點必然會在這個塊的四周(\(|dx|, |dy| \le 1\))。然後直接做發現常數非常的小,再加持上atcoder的機子就隨便過了。複雜度不是很清楚是不是正確的。

code

貼出核心程式碼, 完整程式碼在Atcoder submission

  auto dist = [&](int i, int j) {
    return sqr(p[i].first - p[j].first) + sqr(p[i].second - p[j].second);
  };
  rep(i, 1, n) Mp[mkp(p[i].first / k, p[i].second / k)].eb(i);
  vector<pair<ll, ll> > ans;
  for (auto [pos, v] : Mp) {
    auto [x, y] = pos;
    rep(d, 0, 8) {
      int tx = x + dx[d], ty = y + dy[d];
      if (!Mp.count(mkp(tx, ty))) continue;
      for (auto i : Mp[pos])
        for (auto j : Mp[mkp(tx, ty)])
          if (i < j && dist(i, j) <= sqr(k)) ans.eb(i, j);
    }
  }