首页 > 其他 > 详细

POJ 3218 TOYS(计算几何)(二分)

时间:2014-03-08 04:32:46      阅读:443      评论:0      收藏:0      [点我收藏+]

TOYS

 

大意:给你一个箱子,有n个挡板分隔成n+1部分,给你m个玩具的坐标,问每一部分有几个玩具。

 

思路:举对每个玩具,二分线段下标,判断玩具在线段左边还是右边,枚举后统计。

#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <limits.h>
#include <algorithm>
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define max3(a, b, c) (a>b?max(a, c):max(b, c))
#define min3(a, b, c) (a<b?min(a, c):min(b, c))
#define max4(a, b, c, d) max(max(a, b), max(c, d))
#define min4(a, b, c, d) min(min(a, b), min(c, d))
#define eps 1e-9
#define INF 1 << 30
using namespace std;

int n, m;
int cnt[5010];

struct Point
{
    int x, y;
} P;

struct node
{
    Point a, b;
} Line[5010];

int Location(Point a, Point b, Point c)
{
    return (a.x-c.x)*(b.y-c.y) - (b.x-c.x)*(a.y-c.y);
}

void Binary_Search(Point a, int n)
{
    int l, r, mid;
    l = 0;
    r = n-1;
    while(l < r)
    {
        mid = (l+r)>>1;
        if(Location(a, Line[mid].a, Line[mid].b) > 0)
        {
            l = mid+1;
        }
        else
        {
            r = mid;
        }
    }
    if(Location(a, Line[l].a, Line[l].b) < 0)
    {
        cnt[l]++;
    }
    else
    {
        cnt[l+1]++;
    }
}

void Solve()
{
    int x1, x2, y1, y2, t1, t2;
    while(~scanf("%d", &n) && n)
    {
        memset(cnt, 0, sizeof(cnt));
        scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d", &t1, &t2);
            Line[i].a.x = t1;
            Line[i].a.y = y1;
            Line[i].b.x = t2;
            Line[i].b.y = y2;
        }
        for(int i = 0; i < m; ++i)
        {
            scanf("%d%d", &P.x, &P.y);
            Binary_Search(P, n);
        }
        for(int i = 0; i <= n; ++i)
        {
            printf("%d: %d\n", i, cnt[i]);
        }

        printf("\n");
    }
}

int main(void)
{
    freopen("data.in", "r", stdin);
    //freopen("data.out", "w", stdout);
    Solve();

    return 0;
}



POJ 3218 TOYS(计算几何)(二分),布布扣,bubuko.com

POJ 3218 TOYS(计算几何)(二分)

原文:http://blog.csdn.net/xuechelingxiao/article/details/20720623

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!