1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include <cstdio> #include <iostream> #include <algorithm>
const int N = 1005; int arr[N * 2], cur[N * 2], Map[N][N], sum[N][N]; struct Node { int x, y; } point[N];
int c;
bool check(int len, int n, int m) { for (int x1 = 1, x2 = 1; x2 <= n; x2++) { while(cur[x2] - cur[x1] + 1 > len) x1++; for (int y1 = 1, y2 = 1; y2 <= m; y2++) { while(cur[y2] - cur[y1] + 1 > len) y1++; if(sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1] >= c) return true; } } return false; }
int main() { int n; scanf("%d %d", &c, &n); int k = 0; for (int i = 1; i <= n; i++) { int x, y; scanf("%d %d", &x, &y); arr[++k] = x; arr[++k] = y; point[i].x = x; point[i].y = y; } std::sort(arr + 1, arr + 1 + k); int t = 0; cur[++t] = arr[1]; for (int i = 2; i <= k; i++) { if(arr[i] != arr[i - 1]) cur[++t] = arr[i]; } int xmaxx = 0, ymaxx = 0; for (int i = 1; i <= n; i++) { int l = 1, r = t; while(l < r) { int mid = (l + r + 1) >> 1; if(point[i].x == cur[mid]) { point[i].x = mid; break; } else if(point[i].x > cur[mid]) l = mid; else r = mid - 1; } xmaxx = std::max(xmaxx, point[i].x); l = 1, r = t; while(l < r) { int mid = (l + r + 1) >> 1; if(point[i].y == cur[mid]) { point[i].y = mid; break; } else if(point[i].y > cur[mid]) l = mid; else r = mid - 1; } ymaxx = std::max(ymaxx, point[i].y); } for (int i = 1; i <= n; i++) Map[point[i].x][point[i].y]++; int m = std::max(ymaxx, xmaxx); for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + Map[i][j]; } } int l = 1, r = 10000; while(l < r) { int mid = (l + r) >> 1; if(check(mid, t, t)) r = mid; else l = mid + 1; } printf("%d\n", r); return 0; }
|