POJ 2318-TOYS 叉积+二分

题目链接:http://poj.org/problem?id=2318
题目大意就是一个矩形,被分成很多块,求每块的玩具数目。
我们首先是要判定这个点,是否在区域内,有叉乘的性质可知,令I = AB A B → × × BC B C → , 当I>0时,点C在 AB A B → 的左侧(沿向量方向看去) ,反之亦然,且当I=0时,点C在 AB A B → 上。所以我们只要通过二分的方法,找到第一个在其右侧的隔板即可。
AC代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int N = 5005;

struct Point{
    int x, y;
    Point(){}
    Point(int _x, int _y):x(_x), y(_y){}    //定义两种构造函数
    Point operator - (const Point a) const{
        return Point (x-a.x, y-a.y);
    }
    int operator*(const Point a) const{
        return x*a.y - y*a.x;
    }
};

int n, m, x1, y1, x2, y2;
int U[N], L[N], ans[N];
bool ch(int x, int y, int id)
{
    Point a = Point(L[id], y2), b = Point(U[id], y1);
    Point c = Point(x, y);
    return (c-a) * (b-a) > 0;
}

int find(int x, int y)
{
    int l = 0, r = n+1, mid;
    while(l < r){
        mid = (l+r)>>1;
        if(ch(x, y, mid))   l = mid+1;
        else    r = mid;
    }
    return l-1;
}

int main()
{
    while(~scanf("%d", &n), n){
        int i, j;
        memset(ans, 0, sizeof(ans));
        scanf("%d %d %d %d %d", &m, &x1, &y1, &x2, &y2);
        U[0] = L[0] = x1,   U[n+1] = L[n+1] = x2;
        for(i = 1; i <= n; i++){
            scanf("%d %d", &U[i], &L[i]);
        }
        int x, y;
        for(i = 0; i < m; i++){
            scanf("%d %d", &x, &y);
            ans[find(x, y)]++;
        }
        for(i = 0; i <= n; i++){
            cout << i << ": " << ans[i] << '\n';
        }
        puts("");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值