http://poj.org/problem?id=2318
利用向量外积+lower_bound搞定,见代码。
/*172ms,484KB*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mx = 5005; struct point { int x, y; point() {} point(int x, int y): x(x), y(y) {} }; struct vec { point p1, p2; vec() {} vec(point p1, point p2): p1(p1), p2(p2) {} ///冒号初始化:分配内存空间并赋值 int cross_product(const vec& v) { return (p2.x - p1.x) * (v.p2.y - v.p1.y) - (p2.y - p1.y) * (v.p2.x - v.p1.x); } bool operator < (const point& p) const { return vec(p1, p2).cross_product(vec(p1, p)) < 0; } } v[mx]; int sum[mx]; int main() { int n, m, x1, y1, x2, y2, i, ux, lx, x, y; while (scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2), n) { for (i = 0; i < n; ++i) { scanf("%d%d", &ux, &lx); v[i] = vec(point(lx, y2), point(ux, y1)); } memset(sum, 0, sizeof(sum)); while (m--) { scanf("%d%d", &x, &y); ++sum[lower_bound(v, v + n, point(x, y)) - v]; } for (i = 0; i <= n; ++i) printf("%d: %d\n", i, sum[i]); putchar(10); } return 0; }
http://poj.org/problem?id=2398
和前面那题一样,不过要先给这些纸板的位置排序。
/*0ms,412KB*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mx = 1005; struct point { int x, y; point() {} point(int x, int y): x(x), y(y) {} }; struct vec { point p1, p2; vec() {} vec(point p1, point p2): p1(p1), p2(p2) {} ///冒号初始化:分配内存空间并赋值 int cross_product(const vec& v) { return (p2.x - p1.x) * (v.p2.y - v.p1.y) - (p2.y - p1.y) * (v.p2.x - v.p1.x); } bool operator < (const vec& v) const { return p1.x < v.p1.x; } bool operator < (const point& p) const { return vec(p1, p2).cross_product(vec(p1, p)) < 0; } } v[mx]; int sum[mx], cntsum[mx]; int main() { int n, m, x1, y1, x2, y2, i, ux, lx, x, y; while (scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2), n) { puts("Box"); for (i = 0; i < n; ++i) { scanf("%d%d", &ux, &lx); v[i] = vec(point(lx, y2), point(ux, y1)); } sort(v, v + n); memset(sum, 0, sizeof(sum)); for (i = 0; i < m; ++i) { scanf("%d%d", &x, &y); ++sum[lower_bound(v, v + n, point(x, y)) - v]; } memset(cntsum, 0, sizeof(cntsum)); for (i = 0; i <= n; ++i) ++cntsum[sum[i]]; for (i = 1; i <= m; ++i) if (cntsum[i]) printf("%d: %d\n", i, cntsum[i]); } return 0; }