解题关键:计算几何入门题,通过叉积判断。
两个向量的关系:
P*Q>0,Q在P的逆时针方向;
P*Q<0,Q在P的顺时针方向;
P*Q==0,Q与P共线。
实际就是用右手定则判断的。
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> using namespace std; typedef long long ll; struct point{int x,y; }; int n,m,x1,x2,y11,y2; struct Line{point a,b; }A[5010]; double operator*(point p1,point p2){return p1.x*p2.y-p2.x*p1.y;} point operator-(point A,point B){return {A.x-B.x,A.y-B.y};} int pos[5010]; bool judge(point t,int mid){//叉积 point tt=A[mid].b-A[mid].a; int ans=tt*(t-A[mid].a);return ans<=0; }int erfen(point xx){ int l=0,r=n; while(l<r){int mid=(l+r)>>1; if(judge(xx,mid)) r=mid;else l=mid+1; }return r; }int main(){ while(scanf("%d",&n)!=EOF&&n){ scanf("%d%d%d%d%d",&m,&x1,&y11,&x2,&y2); for(int i=0;i<n;i++){int xd,xu;scanf("%d%d",&xu,&xd);A[i]={{xu,y11},{xd,y2}};}memset(pos,0,sizeof pos);for(int i=0;i<m;i++){int xx,yy;scanf("%d%d",&xx,&yy);point t={xx,yy};int ans=erfen(t);pos[ans]++;}for(int i=0;i<=n;i++){ printf("%d: %d\n",i,pos[i]); }printf("\n");} return 0; }