kmjp's blog

競技プログラミング参加記です

TopCoder SRM 754 Div1 Easy Div2 Hard MoreSquares

これは近い問題考えたことあったのでだいぶすんなり。
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();
	}
}

まとめ

これひっかけ部分あまりなさそうだけどなんでこんな正答率低いんだろう。