题目链接: 点击打开链接
题意:给你一个矩形,然后矩形中有许多分割线,把矩形分割成许多区域,给你一些点,问你分别在每个区域里面有多少个点
这个题的重点是叉乘可以判断点在直线的左边直线的右边还是在直线上,ul叉乘pl结果大于零则p点在直线ul的左边,等于零在直线上,小于零在直线的右边。
代码:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int n,m;
struct node{
double x1,y1,x2,y2;
}a[6000];
int ans[6000];
bool mul(int x,int y,node qq) //true 在边的左上方, false 在边的右上方
{
int xx=qq.x1-qq.x2; int yy=qq.y1-qq.y2;
int xx1=x-qq.x2; int yy1=y-qq.y2;
return (xx*yy1-yy*xx1)>0;
}
int binary_search1(int x,int y)
{
int l=0,r=n+1;
while (l<r)
{
int mid=l+(r-l)/2;
if(mul(x,y,a[mid])) r=mid-1;
else l=mid+1;
}
return l;
}
int main ()
{
while (scanf ("%d",&n)&&n)
{
memset(ans,0,sizeof(ans));
double x1,y1,x2,y2;
scanf ("%d %lf %lf %lf %lf",&m,&x1,&y1,&x2,&y2);
for (int i=1;i<=n;i++)
{
scanf ("%lf %lf",&a[i].x1,&a[i].x2);
a[i].y1=y1; a[i].y2=y2;
}
a[0].x1=x1;a[0].y1=y1;a[0].x2=x1;a[0].y2=y2;
a[n+1].x1=x2;a[n+1].y1=y1;a[n+1].x2=x2;a[n+1].y2=y2;
while (m--)
{
double x,y;
scanf ("%lf %lf",&x,&y);
if(x>x2||x<x1||y>y1||y<y2) continue;
int local=binary_search1(x,y);
if(mul(x,y,a[local])) local--;
ans[local]++;
}
for (int i=0;i<=n;i++)
printf ("%d: %d\n",i,ans[i]);
printf ("\n");
}
return 0;
}