BZOJ1567 [JSOI2008]Blue Mary的战役地图 二分答案 哈希
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1567
题意概括
给出两个n*n的数字矩阵,问最大公共正方形边长。
题解
先二分答案一个m,对于每一个m,哈希大矩阵中每一个位置上的边长为m的正方形,然后排序,lower_bound一下判定即可。
鬼畜的是,我的代码在BZOJ上面过去了,but和hzwer大佬(Orz)的代码对拍没有过去,不知道怎么回事……
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=50+5;
LL n,a[N][N],b[N][N],a1[N][N],a2[N][N],b1[N][N],b2[N][N],A[N*N],B[N*N];
bool check(LL m){
LL mod=2333333333LL,p=1000000007LL,pm=1;
for (int i=1;i<=m;i++)
pm=pm*p%mod;
memset(a1,0,sizeof a1);
memset(a2,0,sizeof a2);
memset(b1,0,sizeof b1);
memset(b2,0,sizeof b2);
memset(A,0,sizeof A);
memset(B,0,sizeof B);
for (int i=1;i<=n;i++)
for (int j=1;j+m-1<=n;j++)
for (int k=1;k<=m;k++)
a1[i][j]=(a1[i][j]*p+a[i][j+k-1])%mod;
for (int i=1;i+m-1<=n;i++)
for (int j=1;j+m-1<=n;j++)
for (int k=1;k<=m;k++)
a2[i][j]=(a2[i][j]*pm+a1[i+k-1][j])%mod;
for (int i=1;i<=n;i++)
for (int j=1;j+m-1<=n;j++)
for (int k=1;k<=m;k++)
b1[i][j]=(b1[i][j]*p+b[i][j+k-1])%mod;
for (int i=1;i+m-1<=n;i++)
for (int j=1;j+m-1<=n;j++)
for (int k=1;k<=m;k++)
b2[i][j]=(b2[i][j]*pm+b1[i+k-1][j])%mod;
int tot=0;
for (int i=1;i+m-1<=n;i++)
for (int j=1;j+m-1<=n;j++)
A[++tot]=a2[i][j],B[tot]=b2[i][j];
sort(A+1,A+tot+1);
sort(B+1,B+tot+1);
for (int i=1;i<=tot;i++)
if (A[lower_bound(A+1,A+tot+1,B[i])-A]==B[i])
return 1;
return 0;
}
int main(){
scanf("%lld",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%lld",&a[i][j]),a[i][j]+=1LL<<31;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%lld",&b[i][j]),b[i][j]+=1LL<<31;
LL le=1,ri=n,mid,ans=0;
while (le<=ri){
mid=(le+ri)>>1;
if (check(mid))
le=mid+1,ans=mid;
else
ri=mid-1;
}
printf("%lld",ans);
return 0;
}
BZOJ1567 [JSOI2008]Blue Mary的战役地图 二分答案 哈希的更多相关文章
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
- B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash
一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- 【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图
引用题解:http://hzwer.com/5153.html 当然,二分可以换成哈希表. #include<cstdio> #include<iostream> #inclu ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)
题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图
1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1011 Solved: 578[Sub ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- [JSOI2008]Blue Mary的战役地图(二分+哈希)
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提高自己的水平. 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打 ...
- bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】
二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...
随机推荐
- CF1066D Boxes Packing
传送门 这题为什么要用二分呢?/huaji 首先可以\(O(n)\)预处理出从某个物品\(i\)开始放,只放一个盒子,能放的最后物品的位置\(j\),只要用两个指针维护左右端点,每次移动一下左端点同时 ...
- IO流总结笔记一
IO流继承关系图 IO概述 IO流是用来处理设备上数据的输入输出. 具体设备有:硬盘,内存,键盘录入等等. IO流的具体分类: 1,根据处理的数据类型不同分为:字节流和字符流,字节流读取的最小单位 ...
- C语言文件操作详解
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 ...
- windws 下 sublime Text 3 ·安装的安装与激活
下载sublime 我们可以到官网进行下载对应的版本 https://www.sublimetext.com/3 如下是官网的内容(我选择的是Windows 64 bit). Sublime Text ...
- Java中ArrayList循环遍历并删除元素的陷阱
ava中的ArrayList循环遍历并且删除元素时经常不小心掉坑里,昨天又碰到了,感觉有必要单独写篇文章记一下. 先写个测试代码: import java.util.ArrayList; public ...
- STM32F103X datasheet学习笔记---RCC(reset and clock control)
1.前言 本文主要记录stm32 关于reset 和 clock部分 datasheet的内容. 2.reset 有三种类型的reset:system reset, power reset, back ...
- KVM -> 虚拟机磁盘管理_03
1.KVM磁盘管理 1.KVM qcow2.raw.vmdk等镜像格式说明:http://blog.csdn.net/zhengmx100/article/details/53887162 raw: ...
- Java基础94 分页查询(以MySQL数据库为例)
1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的). 本文使用的事MySql数据库. 假设:每页显示10条数据. Select * from c ...
- abstract class 和 interface 区别
本文出自与:heipai:tsg666 含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有 abstract 方法的类必须定义为 abstract ...
- 洛谷P1970 花匠
传送门 首先可以知道,如果一个序列是连续上升的,那么只需要取这一个序列中最高的元素即可,因为取其它的不能保证大于后面的.连续下降的序列同理.而这些恰好就是波峰和波谷. 所以遇到 $ j $ 比之前的 ...