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;
}