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

POJ2318【判断点在直线哪一侧+二分查找区间】

时间:2018-04-09 11:11:54      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:clu   sea   sizeof   查找   for   memset   ++   arch   ring   

题目大意:给定一个矩形和一些线段,线段将矩形分割为从左至右的若干部分,之后给出一些玩具的坐标,求每个部分中玩具的数量

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
struct point {
    int x, y;
};
struct Node {
    point a, b;
}A[5010];
int pos[5010];
bool is_right(int xx, int yy, int mid) {
    int ans = (A[mid].a.x - xx)*(A[mid].b.y - yy) - (A[mid].a.y - yy)*(A[mid].b.x - xx);
    if (ans < 0)return false;
    return true;
}
void search(int xx, int yy, int n) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = (left + right) >> 1;
        if (is_right(xx, yy, mid)) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    pos[left]++;
}
int main() {
    int n, m, i, j, x1, x2, y1, y2;
    while (scanf("%d", &n), n) {
        scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
        for (i = 0; i < n; ++i) {
            int xd, xu;
            scanf("%d%d", &xu, &xd);
            A[i].a.x = xu;
            A[i].a.y = y1;
            A[i].b.x = xd;
            A[i].b.y = y2;
        }
        memset(pos, 0, sizeof(pos));
        for (i = 0; i < m; ++i) {
            int xx, yy;
            scanf("%d%d", &xx, &yy);
            search(xx, yy, n);
        }
        for (i = 0; i <= n; ++i) {
            printf("%d: %d\n", i, pos[i]);
        }
        printf("\n");
    }
    return 0;
}

POJ2318【判断点在直线哪一侧+二分查找区间】

标签:clu   sea   sizeof   查找   for   memset   ++   arch   ring   

原文地址:https://www.cnblogs.com/tennant/p/8757339.html

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