これは近い問題考えたことあったのでだいぶすんなり。
https://community.topcoder.com/stat?c=problem_statement&pm=15362
問題
格子点上にある点がいくつか与えられる。
ここに1個点を追加すると、点を4つ結んでできる正方形が増える、というような座標は何通りか。
解法
2点を総当たりし、その2点を結ぶ線分を1辺とする正方形を列挙しよう。
そうすれば残り2点の座標が明らかになるので、もともと片方に点があり、片方になければ、無い方の座標は追加候補となる。
class MoreSquares { public: int countLocations(int N, int SX, int SY, vector <int> X, vector <int> Y) { int i,j; set<pair<int,int>> S; for(i=X.size();i<N;i++) { X.push_back((X.back()*47+42)%SX); Y.push_back((Y.back()*47+42)%SY); } FOR(i,N) S.insert({X[i],Y[i]}); set<pair<int,int>> ret; FOR(i,N) FOR(j,N) { if(X[i]==X[j] && Y[i]==Y[j]) continue; int x3=X[i]-(Y[j]-Y[i]); int y3=Y[i]+(X[j]-X[i]); int x4=X[j]+x3-X[i]; int y4=Y[j]+y3-Y[i]; if(S.count({x3,y3})==0) continue; if(S.count({x4,y4})) continue; ret.insert({x4,y4}); } return ret.size(); } }
まとめ
これひっかけ部分あまりなさそうだけどなんでこんな正答率低いんだろう。