Problem 1298 : Separate Points
keyword
幾何 複素数 回転
概要
平面上に黒の点と白の点が与えられる。黒と白を分断する直線があるかどうか調べる。
原点中心に回転するとx座標だけ比べればよい。誤差の判定とか回転の細かさとか色々気を配る必要があるようです。
けど嘘っぽい解き方だなあ。
#define N 80000 int main(){ int i,j,n,m; double bma,bmi,wma,wmi,ang=PI/N,tmp; static double bxs[100], wxs[100], bys[100], wys[100]; while(scanf("%d%d",&n,&m)){ if(n==0 && m==0) break; REP(i,n)scanf("%lf%lf",bxs+i,bys+i); REP(i,m)scanf("%lf%lf",wxs+i,wys+i); REP(i,N){ bma=wma=-1e99; bmi=wmi=1e99; REP(j,n){ tmp = cos(ang*i)*bxs[j]-sin(ang*i)*bys[j]; if(tmp<bmi)bmi=tmp; if(tmp>bma)bma=tmp; } REP(j,m){ tmp = cos(ang*i)*wxs[j]-sin(ang*i)*wys[j]; if(bmi<tmp && tmp<bma) goto mark; if(tmp<wmi)wmi=tmp; if(tmp>wma)wma=tmp; } if((bma < wmi - EPS) || (wma < bmi - EPS)) break; mark:; } if(i==N)printf("NO\n"); else printf("YES\n"); } return 0; }