您的位置:首页 > 其它

poj2318 Toys-叉积和二分思想

2014-08-19 14:25 92 查看
题目链接:http://poj.org/problem?id=2318

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

#include <iostream>
#include <stdio.h>
#include <string.h>
#define Size 5050
using 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: