方师傅来到了一个二维平面。他站在原点上,觉得这里风景不错,就建了一个房子。这个房子是n个点的凸多边形
,原点一定严格在凸多边形内部。有m个人也到了这个二维平面。现在你得到了m个人的坐标,你要判断这m个人中
有多少人在房子内部。点在凸多边形边上或者内部都认为在房子里面。
标签:out == 表示 多少 bool while char put printf
对每个询问,二分出凸包上对应位置进行判断,二分时可以用极角,当极角相近时换用叉积以减小误差。
#include<bits/stdc++.h> typedef long long i64; char buf[10000007],*ptr=buf; int _(){ int x=0,f=1; while(*ptr<48)*ptr++==‘-‘?f=-1:0; while(*ptr>47)x=x*10+*ptr++-48; return x*f; } int n,m,ans=0; double a0; const double _2pi=std::acos(-1)*2; struct pos{ int x,y; double a; void ga(){ a=std::atan2(y,x)-a0; while(a<0)a+=_2pi; while(a>=_2pi)a-=_2pi; } bool operator<(const pos&w)const{ if(fabs(a-w.a)>1e-6)return a<w.a; return *this*w>0; } i64 operator*(const pos&w)const{return i64(x)*w.y-i64(y)*w.x;} pos operator-(const pos&w)const{return (pos){x-w.x,y-w.y};} }ps[100007]; int query(pos p){ p.ga(); pos*p1=std::upper_bound(ps+1,ps+n+1,p); if((p1[-1]-p)*(p1[0]-p)>=0)return ++ans,1; return -1; } int main(){ fread(buf,1,sizeof(buf),stdin); n=_(); for(int i=1;i<=n;++i)ps[i].x=_(),ps[i].y=_(); a0=std::atan2(ps[1].y,ps[1].x); ps[1].a=0; for(int i=2;i<=n;++i)ps[i].ga(); ps[n+1]=ps[1]; m=_(); int x0=_(),y0=_(); for(int i=2,la=query((pos){x0,y0});i<=m;++i){ x0+=_()*la,y0+=_()*la; la=query((pos){x0,y0}); } printf("%d\n",ans); return 0; }
标签:out == 表示 多少 bool while char put printf
原文地址:http://www.cnblogs.com/ccz181078/p/7501597.html