poj2318 Toys-叉积和二分思想

来源:互联网 发布:java 三大特性 编辑:程序博客网 时间:2024/05/10 08:32

题目链接:http://poj.org/problem?id=2318

对每个玩具二分线段下标,利用叉积判断在线段的左边还是右边,利用二分的思想来查找点在那个段里,然后在那个矩形区域,合并在区域中的数

#include <iostream>#include <stdio.h>#include <string.h>#define Size 5050using namespace std;struct Point{    int x,y;};struct Line{    Point a;    Point b;}line[Size];int cnt[Size];int cross(Point p1,Point p2,Point p0){    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}void Binsearch(Point c,int n){    int l,r,mid;    l=0;r=n-1;    while(l<r)    {        mid=(l+r)/2;        if(cross(c,line[mid].a,line[mid].b)>0)  l=mid+1;        else r=mid;    }    if(cross(c,line[l].a,line[l].b)<0) cnt[l]++;    else        cnt[l+1]++;}int main(){    int n,m,x1,y1,x2,y2;    int t1,t2;    Point toy;    while(scanf("%d",&n)!=EOF&&n)    {        scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);        for(int i=0;i<n;i++)        {            scanf("%d%d",&t1,&t2);            line[i].a.x=t1;            line[i].a.y=y1;            line[i].b.x=t2;            line[i].b.y=y2;         }         memset(cnt,0,sizeof(cnt));         for(int i=0;i<m;i++)         {             scanf("%d%d",&toy.x,&toy.y);             Binsearch(toy,n);         }         for(int i=0;i<=n;i++)         {             printf("%d: %d\n",i,cnt[i]);         }         printf("\n");    }    return 0;}


0 0