ei1903の競プロメモ

競プロの解説など

HOJ 1525 - Counting Squares

問題URL

問題概要

二次元座標平面上に$ \ N \ $個の点があり、$i \ $番目の点の座標は$ \ (x_i,y_i) \ $である。
次の条件を満たす整数$ \ i,j \ $の組の個数を求めよ。

  • $1 \leq i \lt j \leq N$
  • 四角形$ \ (x_i,y_i),(x_i,y_j),(x_j,y_j),(x_j,y_i) \ $は正方形である。

制約

  • $2 \leq N \leq 3 \times 10^5$
  • $-10^9 \leq x_i,y_i \leq 10^9$
  • $(x_i,y_i) \neq (x_j,y_j) \ (i \neq j)$

解説

整数$ \ i,j \ (i \lt j) \ $が条件を満たすとき以下のことが成り立ちます。

  • $x_i + y_i = x_j + y_j \ $または$ \ x_i - y_i = x_j - y_j$

よって、上記の条件を満たすペアを数え上げればよいです。これは求めた値をソートし連続する同じ値の個数から求める方法や、C++ならばstd::mapを使う方法があります。