POJ2318【判斷點在直線哪一側+二分查找區間】
阿新 • • 發佈:2018-04-09
esp else 直線 name sin OS ace 題目 ++i
題目大意:給定一個矩形和一些線段,線段將矩形分割為從左至右的若幹部分,之後給出一些玩具的坐標,求每個部分中玩具的數量
#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【判斷點在直線哪一側+二分查找區間】