【POJ 2318】TOYS 叉积
用叉积判断左右
快速读入写错了卡了3小时hhh
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define N 5003 #define read(x) x = getint() using namespace std; inline int getint() { int fh = 1, k = 0; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) if (c == '-') fh = -1; for(; c >= '0' && c <= '9'; c = getchar()) k = k * 10 + c - '0'; return k * fh; } struct Point { int x, y; Point(int _x = 0, int _y = 0) : x(_x), y(_y) {} }; Point operator - (Point a, Point b) { return Point(a.x - b.x, a.y - b.y); } bool Cross(Point a, Point b) { return a.x * b.y - a.y * b.x > 0; } struct node { Point a, b; }; Point toy; node line[N]; int ans[N], n, m, up, left, down, right; int main() { read(n); while (n) { read(m); read(left); read(up); read(right); read(down); for(int i = 1; i <= n; ++i) { scanf("%d%d", &line[i].a.x, &line[i].b.x); line[i].a.y = up; line[i].b.y = down; } for(int i = 0; i <= n; ++i) ans[i] = 0; while (m--) { read(toy.x); read(toy.y); int l = 1, r = n-1, mid, zuo, you; zuo = Cross(line[1].a - line[1].b, toy - line[1].b); you = Cross(line[n].a - line[n].b, toy - line[n].b); if (zuo) { ++ans[0]; continue; } if (!you) { ++ans[n]; continue; } while (l <= r) { mid = (l + r) >> 1; zuo = Cross(line[mid].a - line[mid].b, toy - line[mid].b); you = Cross(line[mid + 1].a - line[mid + 1].b, toy - line[mid + 1].b); if (zuo) r = mid - 1; else if (!you) l = mid + 1; else break; } ++ans[mid]; } for(int i = 0; i <= n; ++i) printf("%d: %d\n", i, ans[i]); puts(""); read(n); } return 0; }
无语······
NOI 2017 Bless All