码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2318 TOYS/POJ 2398 Toy Storage

时间:2017-01-10 08:44:24      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:size   while   namespace   define   ++   end   line   storage   operator   

计算几何终于开坑了。。。

叉积+二分。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 5050
using namespace std;
struct point
{
    int x,y;
    point (int x,int y):x(x),y(y) {}
    point () {}
    friend point operator-(point x,point y)
    {
        return point(x.x-y.x,x.y-y.y);
    }
}p[maxn];
struct line
{
    point x,dt;
    line (point x,point dt):x(x),dt(dt) {}
    line () {}
    friend int operator*(line x,line y)
    {    
        return x.dt.x*y.dt.y-y.dt.x*x.dt.y;
    }     
}l[maxn];
int n,m,cnt[maxn],x1,y1,x2,y2,x,y;
bool check(int xs) {return (line(l[xs].x,point(x,y)-l[xs].x)*l[xs])>=0;}
int ask()
{
    int l=0,r=n,ans=-1;
    while (l<=r)
    {
        int mid=(l+r)>>1;
        if (check(mid)) {ans=mid;l=mid+1;}
        else r=mid-1;
    }
    return ans;
}
int main()
{
    for (;;)
    {
        scanf("%d",&n);if (!n) break;scanf("%d",&m);
        scanf("%d%d%d%d",&x1,&y2,&x2,&y1);
        memset(cnt,0,sizeof(cnt));
        l[0]=line(point(x1,y1),point(0,y2-y1));
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            l[i]=line(point(y,y1),point(x-y,y2-y1));    
        }
        l[n+1]=line(point(x2,y1),point(0,y2-y1));
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            cnt[ask()]++;
        }
        for (int i=0;i<=n;i++) printf("%d: %d\n",i,cnt[i]);
        printf("\n");
    }
    return 0;
}

 

POJ 2318 TOYS/POJ 2398 Toy Storage

标签:size   while   namespace   define   ++   end   line   storage   operator   

原文地址:http://www.cnblogs.com/ziliuziliu/p/6267121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!