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选 ...
随机推荐
- mongoDB - 日常操作一
mongodb 启动方式 # 不启动认证 ./mongod --bind_ip 172.16.2.17 --port --fork --logpath=/opt/mongodb/mongodb.log ...
- Ansi与Unicode编码
视频教程:Ansi与Unicode编码 大家在编程时经常遇到的数据类型: ● Ansi: char 代表一个字符 (CHAR) char * 代表一个字符串指针 (PCHAR PST ...
- W3C规范
连接:https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html W3C 代码标准规范 由 路飞 创建, 最后一次修改 2017-01-03 W ...
- MHA-手动Failover流程(传统复制>ID复制)
本文仅梳理手动Failover流程.MHA的介绍详见:MySQL高可用架构之MHA 一.基本环境 1.1.复制结构 VMware10.0+CentOS6.9+MySQL5.7.21 ROLE HOST ...
- servlet相关
servlet是在服务器端运行的一个小程序.一个servlet就是一个java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的servlet程序. 1.生命周期 2.内置对象 r ...
- mysql案例~关于mysql的配置文件个人见解
mysql 设置参数解读一 mysql的参数分为几类 1 session级别可以设置 2 global级别可以设置 3 session+global级别可以设置 4 ...
- python 设计及调试的一些小技巧
在“笨办法学习python”中介绍了一些设计函数以及调试技巧: 参考网址:http://www.jb51.net/shouce/Pythonbbf/latest/ex36.html If 语句的规则¶ ...
- log4j日志日记记录使用教程
注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太多了...... Logger必须作为类的静态变量使用.原因如下: 1 使用static修饰的属性是归这个类使用的2 也就是 ...
- 数组Array的一些方法
数组对象属性和方法的概述:1> arr.push() 将参数添加至数组的末尾,返回的是新数组的长度2> arr.unshift() 将参数添加到数组的开头,返回新数组的长度3> ar ...
- 使用matplotlib绘制多个图形单独显示
使用matplotlib绘制多个图形单独显示 一 代码 import numpy as np import matplotlib.pyplot as plt #创建自变量数组 x= np.linspa ...