Toy Storage--POJ2398(计算几何)

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

这道题和上一道TOYS是一样的   就是输出不一样  还有就是这个给的是乱序  你要先对挡板排序  

#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],u[N];
int y2;

int cmp(const void *a,const void *b)
{
    struct node *c, *f;
    c=(struct node *)a;
    f=(struct node *)b;
    return c->x-f->x;
}

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)
    {
        l=mid;
        r=r;
        return Find(nx,ny,l,r);
    }
    else if((d.x*p[mid].y)-(d.y*p[mid].x)<0)
    {
        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);
        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[i].x,&u[i].y);
        }
        qsort(u+1,n,sizeof(u[0]),cmp);
        for(int i=1;i<=n;i++)
        {
            p[i].x=u[i].x-u[i].y;
            p[i].y=y1-y2;
            p[i].v=u[i].y;
        }
        p[n+1].x=x2;
        p[n+1].y=y1;
        p[n+1].v=x2;
        int k,v;
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&k,&v);
            int aa=Find(k,v,0,n+1);
            a[aa]++;
        }
        int ans[N];
        memset(ans,0);
        for(int i=0;i<=n;i++)
        {
            if(a[i])
            {
                ans[a[i]]++;
            }
        }
        printf("Box\n");
        for(int i=1;i<=n;i++)
        {
            if(ans[i])
                printf("%d: %d\n",i,ans[i]);
        }
    }
    return 0;
}

 

posted @ 2016-04-18 21:02  啦咯  阅读(359)  评论(0编辑  收藏  举报