SRM546 Div2 Medium - TwoRectangles

問題

長方形が2つ、それぞれ左下と右上の点の座標が与えられる
これらの長方形の共通範囲が 長方形 or 線 or 点 or 存在しない のどれであるか判定せよ

0 <= 各座標 <= 1000

解法

初期値0の2次元配列で2つの長方形が占める領域をそれぞれ全部+1すると、重なってる部分は2になる
2のマスが1個でもあれば答えは少なくともpointにはなる
ある2のマスと上下左右で隣接する2のマスがあれば答えは少なくともsegmentになる
2のマスが4つ固まった正方形があれば答えはrectangleになる

俺はスタックオーバーフローがトラウマになってるんだけど、調べてみたらtopcoderはスタック領域は8MBくれるらしい
(ソースはhelpのgeneral Q&A)
今回のint10^6個は大丈夫だけどlonglong10^6個は無理(というかぴったり入るけど他のことが何も出来ない)って感じ
Linuxのデフォルトが8MBらしいけど他のサイトでもそうなのかな?

class TwoRectangles {
public:
	string describeIntersection(vector<int> a, vector<int> b) {
		int s[1010][1010] = {};
		reps(i,a[0],a[2]+1) reps(j,a[1],a[3]+1) s[i+1][j+1]++;
		reps(i,b[0],b[2]+1) reps(j,b[1],b[3]+1) s[i+1][j+1]++;
		int res = 0;
		reps(i,1,1005) reps(j,1,1005) if (s[i][j]==2) {
			chmax(res, 1);
			if (s[i-1][j]==2 || s[i+1][j]==2 || s[i][j-1]==2 || s[i][j+1]==2) chmax(res, 2);
			if (s[i+1][j]==2 && s[i][j+1]==2 && s[i+1][j+1]==2) chmax(res, 3);
		}
		if (res==3) return "rectangle";
		if (res==2) return "segment";
		if (res==1) return "point";
		return "none";
	}
};