[POJ 2318] TOYS

Description

一些直线把一个矩形分割成了若干部分,给出一些点的坐标,问每个部分里有多少点。

Solution

二分 + 叉积判断左右。

Code

#include <cstdio>
#include <cstring>

struct Point {
    int x, y;
};
struct Segment {
    Point a, b;
} s[5005];

int n, m, x1, y1, x2, y2, t1, t2, ans[5005];

Point sub(Point a, Point b) {
    Point p;
    p.x = a.x - b.x, p.y = a.y - b.y;
    return p;
}
int cross(Point a, Point b) {
    return a.x * b.y - b.x * a.y;
}
int turn(Point p1, Point p2, Point p3) {
    return cross(sub(p1, p2), sub(p3, p2));
}
void solve(Point x) {
    int l = 0, r = n, mid;
    while (l < r) {
        mid = l + ((r - l + 1) >> 1);
        if (turn(s[mid].a, s[mid].b, x) > 0) r = mid - 1;
        else l = mid;
    }
    ++ans[l];
}

int main() {
    for (;;) {
        scanf("%d", &n);
        if (!n) break;
        memset(ans, 0, sizeof ans);
        scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
        for (int i = 1; i <= n; ++i) {
            scanf("%d%d", &t1, &t2);
            s[i].a.x = t1, s[i].a.y = y1;
            s[i].b.x = t2, s[i].b.y = y2;
        }
        for (int i = 1; i <= m; ++i) {
            Point p;
            scanf("%d%d", &p.x, &p.y);
            solve(p);
        }
        for (int i = 0; i <= n; ++i) printf("%d: %d\n", i, ans[i]);
        puts("");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fly-in-milkyway/p/10016824.html