TopCoder SRM 562 Div1 Medium CheckerFreeness
問題
座標平面上に白い点がn個、黒い点がm個与えられる。
これらの点から異なる4点を選び、checkerな四角形を作ることができるならば、NOを、
作ることができないならばYESを答えよ。
ただし、checkerな四角形とは、白い点、黒い点、白い点、黒い点を順に結んでできる、凸四角形のことを言う。
制約条件
n, m≦222
1≦座標≦10^7
方針
白い点二つを結んでできる線分と、黒い点二つを結んでできる線分が交差するならば、
それらの点を使ってchekerな四角形を作ることができる。
このとき、白い点の凸包と黒い点のクリーク辺が交わるか、
黒い点の凸包と、白い点のクリーク辺が交わるかのどちらか。
ソースコード
vi parse(vector<string> &v){ string s; vi res; int t; rep(i, v.size()) s += v[i]; stringstream ss(s); while(ss >> t) res.pb(t); return res; } bool check(G &h, G &ps){ G g = convex_hull(h); rep(i, ps.size()) rep(j, i) rep(k, g.size()){ if(intersectSS(ps[i], ps[j], g[k], g[(k + 1) % g.size()])) return 1; } return 0; } class CheckerFreeness { public: string isFree(vector <string> whiteX, vector <string> whiteY, vector <string> blackX, vector <string> blackY) { vi wx = parse(whiteX), wy = parse(whiteY); vi bx = parse(blackX), by = parse(blackY); G w, b; rep(i, wx.size()) w.pb(P(wx[i], wy[i])); rep(i, bx.size()) b.pb(P(bx[i], by[i])); return check(w, b) || check(b, w) ? "NO" : "YES"; } };