題意
在平面直角座標系中找出所有\(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);
}
}