Particle

競技プログラミングについての雑記

AOJ 0518: The Oldest Site

点A(a,b)と点B(c,d)があるとき、a <= c && b < dのときだけ判定すれば、2重ループで全てのパターンを調べることができます。点が2つ定まった時にできる正方形は2通りだけありますが、少し考えれば片方だけ考慮すれば良いことが分かります。
A,Bを探すときは、入力された順に辿って行き、正方形ができているか調べるときは、辿らずに直接調べることで、O(n^2)になります。(全部辿るとO(n^4)になる)

#include<cstdio>
#include<cstring>
using namespace std;

int x[3000],y[3000],n,r;
bool g[5001][5001];

int main(){
	while(scanf("%d",&n),n){
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(g,0,sizeof(g));
		int ans = 0;
		for(int i = 0; i < n; i++){
			scanf("%d%d",x+i,y+i);
			g[x[i]][y[i]] = 1;
		}
		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
				int dx = x[j]-x[i],dy = y[j]-y[i],res = dx*dx+dy*dy;
				if(dx>=0 && dy>0 && res>ans && x[j]+dy<=5000 && y[i]-dx>=0 && g[x[i]+dy][y[i]-dx] && g[x[j]+dy][y[j]-dx])ans = res;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}