标签:
Description

Input
Output
Sample Input
5 6 0 10 60 0 3 1 4 3 6 8 10 10 15 30 1 5 2 1 2 8 5 5 40 10 7 9 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 25 10 35 10 45 10 55 10 65 10 75 10 85 10 95 10 0
Sample Output
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
通过结果的正负判断两矢量之间的顺逆时针关系
若 a x b > 0表示a在b的顺时针方向上
若 a x b < 0表示a在b的逆时针方向上
若 a x b == 0表示a在b共线,但不确定方向是否相同
记玩具在点p0,某块板的上边点是p1,下边点是p2,p2p1(向量)×p2p0>0表示p0在p1p2的左面,<0表示在右面。接下来就是用二分法找出每个点所在的分区。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<string>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int n,m,xx,yy,x2,y2;
struct Line
{
int u,l;
}line[5010];
int toy[5010];
bool isplace(int x,int y,int u,int l)
{
if((x-l)*(yy-y2)-(y-y2)*(u-l)<0)
return true;//左
return false;
}
int binarysearch(int x,int y)
{
int l=0,r=n;
while(l<r)
{
int mid=(l+r)/2;
if(isplace(x,y,line[mid].u,line[mid].l))
r=mid;
else
l=mid+1;
}
return l;
}
int main()
{
bool flag=0;
while(cin>>n)
{
if(n==0)
return 0;
if(flag)
cout<<endl;
else
flag=1;
scanf("%d%d%d%d%d",&m,&xx,&yy,&x2,&y2);
for(int i=0;i<=n-1;i++)
scanf("%d%d",&line[i].u,&line[i].l);
memset(toy,0,sizeof(toy));
for(int i=0;i<=m-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
toy[binarysearch(a,b)]++;
}
for(int i=0;i<=n;i++)
cout<<i<<": "<<toy[i]<<endl;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/winycg/article/details/51340837