Gym 102091L Largest Allowed Area 【二分+二维前缀和】
<题目链接>
题目大意:
给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少。
解题分析:
用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任意子矩阵中1的个数,然后就是二分答案枚举边长。
#include <bits/stdc++.h>
using namespace std; template<typename T>
inline void read(T&x){
x=;int f=;char ch = getchar();
while(ch<'' ||ch>''){ if(ch=='-')f=-;ch=getchar(); }
while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
x*=f;
}
#define rep(i,s,t) for(int i=s;i<=t;i++)
const int N = 1e3+;
int n,m,arr[N][N],sum[N][N]; bool check(int x){
rep(i,,n) rep(j,,m) {
if(i<x || j<x)continue;
int num=sum[i][j]-sum[i][j-x]-sum[i-x][j]+sum[i-x][j-x]; //得到任意子矩阵的值
if(num<=)return true;
}
return false;
}
int main(){
int T;read(T);while(T--){
memset(arr,,sizeof(arr));
memset(sum,,sizeof(sum));
read(n);read(m);
rep(i,,n) rep(j,,m) {
read(arr[i][j]);
sum[i][j] = arr[i][j]+sum[i-][j]+sum[i][j-]-sum[i-][j-]; //维护二维前缀和
}
int l=,r=1e3+,ans=;
while(l<=r){ //二分枚举正方形边长
int mid=l+r>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
}
Gym 102091L Largest Allowed Area 【二分+二维前缀和】的更多相关文章
- poj_3179 Corral the Cows (二分+二维前缀和+离散化)
[题目链接] http://poj.org/problem?id=3179 [参考] http://www.cnblogs.com/evenbao/p/9243183.html [算法] 二分答案+判 ...
- Acwing-121-赶牛入圈(二分, 二维前缀和,离散化)
链接: https://www.acwing.com/problem/content/123/ 题意: 农夫约翰希望为他的奶牛们建立一个畜栏. 这些挑剔的畜生要求畜栏必须是正方形的,而且至少要包含C单 ...
- cf1073c 二分+二维前缀和
#include<bits/stdc++.h> using namespace std; #define maxn 200005 char s[maxn]; ][maxn]; map< ...
- Largest Allowed Area【模拟+二分】
Largest Allowed Area 题目链接(点击) 题目描述 A company is looking for land to build its headquarters. It has a ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- CF Gym 100463D Evil (二维前缀和+离散)
题意:给一些带颜色的点,求一个最小的矩形,恰好包括一半的红色点,且不包括蓝色点. 题解:暴力,求个二维前缀和,用容斥原理更新一下.N很小所以我采用了离散优化,跑了个0ms. 之前没写过二维前缀和,加上 ...
- Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)
题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...
- [CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)
题目传送门(内部题26) 输入格式 第一行有$3$个整数$n,m,q$.然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子.然后有$q$行,每行$2$个整数$x,y ...
随机推荐
- python 列表,字典,元组,字符串,常用函数
飞机票 一.列表方法 1.ls.extend(object) 向列表ls中插入object中的每个元素,object可以是字符串,元组和列表(字符串“abc”中包含3个元组),相当于ls和object ...
- 【MySql】join操作
飞机票 飞机票 加油 INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN( ...
- java 中int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- Java的家庭记账本程序(D)
日期:2019.2.8 博客期:031 星期一 今天是把程序的查询功能以列表的形式完成了! 截图如下:
- python 与mongodb 交互
创建管理员 1 > use admin 2 switched to db admin 3 > db 4 admin 5 > db.createUser({user:'admin',p ...
- Cookie禁用了,Session还能用吗?原因详解
Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.但为什么禁用Cookie就不能得到Session ...
- java多线程快速入门(十九)
如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...
- ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'mysql'
原因:修改数据库账号时删除了默认的localhost root, 新建了% root 但没有赋予全部权限; 解决方法: 1.关闭数据库# mysqld stop 2.在my.cnf里加入skip-g ...
- NPOI操作Excel(一)--NPOI基础
用C#读取Excel的方法有很多中,由于近期工作需要,需要解析的Excel含有合并单元格以及背景色等特殊要求,故在网上查了一些关于读Excel的方法的优缺点,觉得NPOI能满足我的需要,所以搜索了一些 ...
- centos7.4/rehat7.0系统安装
以下是安装过程:(图解),以下是rehat为例 这里可以改为centos的镜像 之后就可以用了,记得做快照!!! 拓展:分离使用 效果: