题目描述

农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方。我们假定,他的农场划分成 n * n的方格。输入数据中包括有树的方格的列表。你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚。牛棚的边必须和水平轴或者垂直轴平行。 考虑下面的方格,它表示农夫约翰的农场,.表示没有树的方格,#表示有树的方格

........
.#...#..
........
........
........
..#.....
........
........

那么最大的牛棚是5*5的。

输入描述

第一行输入一个正整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1≤n≤1000)代表农场的大小,一个正整数 T ( 1 ≤ T ≤ n ∗ n ) T(1≤T≤n∗n) T(1≤T≤n∗n), 接下来 T T T 行,每行 2 2 2个整数,代表有树的格子的横纵坐标,保证任意两个树格子不相同

输出描述

输出一个正整数代表牛棚的最大边长

样例输入

8 3
2 2
2 6
6 3

样例输出

5

解题思路

可以看出问题具有单调性:牛棚越大,修建的可能性越小;反之,可能性越大

而我们需要找出可能修建的最大的牛棚,所以采用二分法

int bin_search() {int l = 0, r = w + 1, m;while (l + 1 != r) {m = (l + r) / 2;if (judge(m)) l = m;else r = m;}return l;
}

然后就是如何实现judge函数的问题了

显然,判断牛棚大小是否可行,需要遍历所有可能的位置,采用二重循环实现

bool judge(int m) {for (int i = 1; i <= w - m + 1; i++) {for (int j = 1; j <= w - m + 1; j++) {if (找到可行位置) return true;}}return false;
}

那么最后一个问题:找到可行位置的条件是什么?

如果一棵一棵树判断,肯定TLE的飞起,所以需要想一想其他方法

这时候就要提到矩阵前缀和的概念了,这一方法应用于矩阵中,用于降低判断的时间复杂度

规定 p r e [ x ] [ y ] = ∑ 1 ≤ i ≤ x ∑ 1 ≤ j ≤ y m a p [ i ] [ j ] pre[x][y]=\sum_{1 \le i \le x}{\sum_{1 \le j \le y}{map[i][j]}} pre[x][y]=∑1≤i≤x​∑1≤j≤y​map[i][j]

其中map为二维bool数组,有树为true,无树为false

接下来介绍另外一个原理:包含排斥原理

首先看一下下面这张图

我们要计算 4 4 4号区域的 s u m 4 sum_4 sum4​则有 s u m 4 = s u m 1 , 2 , 3 , 4 − s u m 1 , 2 − s u m 1 , 3 + s u m 1 sum_{4}=sum_{1,2,3,4}-sum_{1,2}-sum_{1,3}+sum_{1} sum4​=sum1,2,3,4​−sum1,2​−sum1,3​+sum1​

这就是包含排斥原理的简单理解,也足够我们解决这道题了

应用以上两个概念,我们可以计算出指定区域内的矩阵和,如果和为 0 0 0则可行;反之,继续尝试下一个区域

最后,AC代码如下

#include <iostream>
using namespace std;
const int max_n = 1e3;int w, n;
bool map[max_n + 1][max_n + 1];
int pre[max_n + 1][max_n + 1];bool judge(int m) {for (int i = 1; i <= w - m + 1; i++) {for (int j = 1; j <= w - m + 1; j++) {int x = i + m - 1, y = j + m - 1;if (!(pre[x][y] - pre[x][j - 1] - pre[i - 1][y] + pre[i - 1][j - 1]))return true;}}return false;
}int bin_search() {int l = 0, r = w + 1, m;while (l + 1 != r) {m = (l + r) / 2;if (judge(m)) l = m;else r = m;}return l;
}int main() {cin >> w >> n;int x, y;for (int i = 1; i <= n; i++) {cin >> x >> y;map[x][y] = true;}for (int i = 1; i <= w; i++) {for (int j = 1; j <= w; j++) {pre[i][j] = map[i][j] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1];}}cout << bin_search() << endl;return 0;
}

[Daimayuan] 巨大的牛棚(C++,矩阵前缀和)相关推荐

  1. 蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举

    资源限制 时间限制:2.0s 内存限制:512.0MB 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M× ...

  2. codevs 1373 射命丸文(矩阵前缀和)

    题目描述 Description 在幻想乡,射命丸文是以偷拍闻名的鸦天狗.当然,文文的照相机可不止能够照相,还能够消除取景框里面所有的弹幕.假设现在文文面前有一块N行M列的弹幕群,每一个单位面积内有分 ...

  3. UVALive - 7139 Rotation 矩阵前缀和(imos和)

    传送门:UVALive 7139 题意:N*M的网格,一辆车沿着网格线按给定路线走,每个网格里有一个人,人的视线始终看着车,问这些人净转圈数的平方和. 思路:因为起点和终点都是左上角,因此我们可以维护 ...

  4. UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  5. UVALive 7139 Rotation 二维vector+矩阵前缀和 【模版】

    题目大意:给一个n*m的矩阵,每个方块上有一个人.现在有一辆车在左上角的格点处,矩阵里的人都会一直面向那辆车.现在给出车的移动路线,问每个人总旋转角度的平方和是多少.若一个人顺时针旋转10个圈,逆时针 ...

  6. CodeVS1373 射命丸文【矩阵前缀和】

    题目描述 Description 在幻想乡,射命丸文是以偷拍闻名的鸦天狗.当然,文文的照相机可不止能够照相,还能够消除取景框里面所有的弹幕.假设现在文文面前有一块N行M列的弹幕群,每一个单位面积内有分 ...

  7. 【8.6】代码源 - 【前缀集】【矩阵游戏】【谁才是最终赢家?】【放置多米诺骨牌】

    #930. 前缀集 题意:给定两个长为 n ( 1 ≤ n ≤ 5 × 1 0 5 ) n(1\leq n\leq 5\times 10^5) n(1≤n≤5×105) 的序列 a i , b i a ...

  8. leetcode1314. 矩阵区域和(动态规划)

    给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: i - K < ...

  9. 蓝桥训练之前缀和与差分

    配套视频链接 https://www.bilibili.com/video/BV1xq4y1y7Kz 一.前缀和 1.1什么是前缀和 前缀和是一种重要的预处理,能大大降低查询的时间复杂度.常常用于一些 ...

最新文章

  1. GitHub推出云端IDE,几秒完成开发环境配置,今后可以在浏览器里使用VS Code了
  2. ubuntu16.04忘了root密码
  3. mysql 新建库在哪找_求助,mysql创建数据库找不到文件在哪问题
  4. [转]查看事物码相关的数据对象
  5. 【网址收藏】Ubuntu使用OBS录制桌面时黑屏怎么办?
  6. 项目添加服务器上数据库正常,添加本地的数据库出现问题(The user specified as a definer ('root'@'%') does not exist)...
  7. zabbix简单介绍(1)
  8. Makefile文件(四)_书写命令
  9. Windows phone 8 是新的起点吗?
  10. c++内联函数解析(inline)
  11. 科技经济调整td-scdma中国
  12. 电骡服务器搜索文件排序,电骡搜中文名资源一定要注意的技巧及其他
  13. java-日期操作总结
  14. -O1 -O2 -O3 优化的原理是什么?
  15. ocdma相干非相干_相干成像和非相干成像有什么区别?
  16. 佳能扫描仪按下按钮后自动打开phtoshop怎么办
  17. 2021十大亚洲现货黄金交易APP平台排名榜单
  18. Ubuntu新手-谈第一次在Ubuntu升级VMware Tolls
  19. 旋转矩阵变换左右手系
  20. internship:交付之后的接口

热门文章

  1. HTTP CHUNKED
  2. MATLAB绘制雷达图/蜘蛛图
  3. MySQL数据库安全配置规范
  4. 航空发动机控制学习笔记(二)
  5. CUDA9.2 在1070maxq下的安装
  6. 强化学习(Reinforcement Learning)中的Q-Learning、DQN,面试看这篇就够了!
  7. java线程池的简单使用
  8. 每一个搞爬虫的人,都应该知道的神器!
  9. 将html中的style内联样式转换为行内样式
  10. [Re]南邮ctf平台逆向题