同2318
在其基础上,输入需要排序,输出稍复杂
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define maxn 5005 struct Elem { int cnt; //point count int num; //box num bool operator < (const Elem &a) const { return cnt < a.cnt; } }elem[maxn]; struct Line { int u, d; bool operator < (const Line &a) const { return u < a.u; } } line[maxn]; int n, m, x1, x2, y1, y2; int toy[maxn]; int box_cnt[maxn]; int elem_num; bool left(int x, int y, Line a) { if (x < a.d + (y - y2) * (a.u - a.d) * 1.0 / (y1 - y2)) return true; return false; } int binarysearch(int x, int y) { int l = 0, r = n; int mid; while (l < r) { mid = (l + r) / 2; if (left(x, y, line[mid])) r = mid; else l = mid + 1; } return l; } int main() { //freopen("t.txt", "r", stdin); while (scanf("%d", &n), n != 0) { memset(toy, 0, sizeof(toy)); scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2); for (int i = 0; i < n; i++) scanf("%d%d", &line[i].u, &line[i].d); sort(line, line + n); for (int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); toy[binarysearch(x, y)]++; } memset(box_cnt, 0, sizeof(box_cnt)); for (int i = 0; i <= n; i++) box_cnt[toy[i]]++; elem_num = 0; for (int i = 1; i <= n; i++) if (box_cnt[i] > 0) { elem[elem_num].cnt = i; elem[elem_num].num = box_cnt[i]; elem_num++; } sort(elem, elem + elem_num); puts("Box"); for (int i = 0; i < elem_num; i++) printf("%d: %d ", elem[i].cnt, elem[i].num); } return 0; }