牛栏POJ3179(待补)
思路
题干在这:POJ3179
统计各地点草的个数同时算一个最大的边长,然后求出二维前缀和,二分正方形边长,枚举算出答案。
但这个题我非常chun地直接做,结果超出内存限制……我们能发现输入的点的个数很少,我们应该离散化处理,缩小二维数组的内存。
但我现在懒得改了,待补
ml代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MAX 10010
using namespace std;
int grass[MAX][MAX] = { 0 };
int main() {
int c, n;
cin >> c >> n;
int lmax = 0;
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
grass[x][y]++;
lmax = max(lmax, max(x, y));
}
for (int i = 1; i <= lmax; i++)
for (int j = 2; j <= lmax; j++)
grass[i][j] += grass[i][j - 1];
for (int j = 1; j <= lmax; j++)
for (int i = 2; i <= lmax; i++)
grass[i][j] += grass[i - 1][j];
int l = 1, r = lmax;
while (l != r) {
int mid = (l + r) / 2;
int maxgrass = 0;
for (int i = 1; i <= lmax; i++) {
for (int j = 1; j <= lmax; j++) {
int xmax = min(lmax, i + mid - 1), ymax = min(lmax, j + mid - 1);
int num = grass[xmax][ymax] + grass[i - 1][j - 1] - grass[xmax][j - 1] - grass[i - 1][ymax];
maxgrass = max(maxgrass, num);
}
}
if (maxgrass >= c)
r = mid;
else
l = mid + 1;
}
cout << l;
}