TOYS--POJ2318

http://poj.org/problem?id=2318

这是我写的第一道计算几何的题   然后竟然一A了  心情超级激动啊  !!!!

我就只看了课件上说的叉积  然后就想到要这样写  我看学长的代码  太深奥  不行  还是自己写吧  然后就哇哈哈哈哈  

题目大意:  给你一个长方形盒子   然后给你n个挡板把他分成n+1个小区域  有m个玩具  给你盒子的坐标  和每个挡板的坐标  还有每个玩具的坐标  

然后让你求每个小区域内有几个玩具   是不是很简单

分析:

我想的是我把每个挡板用向量表示出来   然后给出每一个玩具的坐标看他是在挡板的那边    

这到题用二分搜索   如果直接遍历会超时吧  应该   反正我看他们都用二分  我也用的二分就过了   

二分的递归  好像第一次写这么好

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <math.h>
#include <ctype.h>

using namespace std;
#define memset(a,b) memset(a,b,sizeof(a))
#define N 5500
typedef long long  ll;

struct node
{
    int x, y, v;
}p[N];
int y2;

int Find(int nx,int ny,int l,int r)
{
    if(l==r-1)
        return l;
    int mid=(l+r)/2;
    node d;
    d.x=nx-p[mid].v;
    d.y=ny-y2;
    if((d.x*p[mid].y)-(d.y*p[mid].x)>0)///如果d点在右边
    {
        l=mid;
        r=r;
        return Find(nx,ny,l,r);
    }
    else if((d.x*p[mid].y)-(d.y*p[mid].x)<0)///如果d点在左边
    {
        l=l;
        r=mid;
        return Find(nx,ny,l,r);
    }
    return 0;
}

int main()
{
    int n,m,x1,x2,y1,a[N];
    while(scanf("%d",&n),n)
    {
        memset(a,0);
        int u,v;
        scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
        p[0].x=x1;
        p[0].y=y2;
        p[0].v=x1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&u,&v);
            p[i].x=u-v;
            p[i].y=y1-y2;
            p[i].v=v;
        }
        p[n+1].x=x2;
        p[n+1].y=y1;
        p[n+1].v=x2;
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&u,&v);
            int aa=Find(u,v,0,n+1);
            a[aa]++;
        }
        for(int i=0;i<=n;i++)
        {
            printf("%d: %d
",i,a[i]);
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linliu/p/5405652.html