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"; } };