PKU : 3432 - Count Squares
アルゴリズム
N=2000なので, 4乗解法では通らないでしょう.
ある二点を選んだとき, 正方形になるような位置に残りの2点があるかを調べましょう.
これで2乗解法になって通ります.
AOJの0518は, 全く同じ問題だったはず.
プログラム
typedef pair<int,int> P; int main(void){ int n; int x[2000],y[2000]; while(scanf("%d",&n) != EOF){ int ans = 0; set<P> s; rep(i,n){ s.insert(P(x[i],y[i])); } //点を昇順に並び変え int idx = 0; foreach(i,s){ x[idx] = i->first; y[idx] = i->second; idx++; } rep(i,n){ REP(j,i+1,n){ int diffX = x[j] - x[i]; int diffY = y[j] - y[i]; P a(x[i]+diffY,y[i]-diffX); P b(x[j]+diffY,y[j]-diffX); if(s.find(a)!=s.end() && s.find(b)!=s.end()){ ans++; } } } printf("%d\n",ans/2); } }