POJ 2318 TOYS

来源:互联网 发布:淘宝手机端怎么改好评 编辑:程序博客网 时间:2024/06/04 01:14

二分。

添加一个编号为0的直线,为格子的左边框。二分,叉积判断离点最近的左边第一条直线编号即可。

早上脑子有点不清楚,犯了一些奇怪的错误,狂WA不止。。。

#include<cstdio>#include<cstring>double x1[5005], x2[5005], X1, Y1, X2, Y2;int cnt[5005], n, m;bool cross(double x, double y, double up_x, double down_x){    double x1=down_x-x, x2=up_x-x, y1=Y2-y, y2=Y1-y;    return x1*y2-x2*y1<0;}int main(){    while(scanf("%d",&n))    {        if(!n){break;}        scanf("%d",&m);        memset(cnt,0,sizeof(cnt));        scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);        x1[0]=x2[0]=0;        for(int i = 1; i <= n; i++)        {            scanf("%lf%lf",&x1[i],&x2[i]);            x1[i]-=X1;            x2[i]-=X1;        }        for(int i = 1; i <= m; i++)        {            double x,y;             scanf("%lf%lf",&x,&y);            x-=X1;            int l = 0, r = n;            while(l<r)            {                int mid=(l+r+1)>>1;                if(cross(x,y,x1[mid],x2[mid]))l=mid;                else r=mid-1;            }             cnt[l]++;        }        for(int i = 0; i <= n; i++)            printf("%d: %d\n",i,cnt[i]);        puts("");    }}
1 0
原创粉丝点击