求第k大用堆维护最值并出堆的时候扩展的经典题...

  因为只有正数,所以一个矩阵的权值肯定比它的任意子矩阵的权值大,那么一开始把所有满足条件的最小矩阵加进堆里,弹出的时候上下左右扩展一行加进堆,用hash判重即可

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
#define uint unsigned int
#define ull unsigned long long
using namespace std;
const int maxn=, mod=;
struct poi{int x1, yy1, x2, y2; uint sum;};
struct tjm{ull too; int pre;}e[];
priority_queue<poi>q;
bool operator<(poi a, poi b){return a.sum>b.sum;}
int n, m, mna, mnb, k, tot;
int last[mod];
uint mp[maxn][maxn];
void read(uint &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-' && (f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
inline void add(int x, ull y){e[++tot].too=y; e[tot].pre=last[x]; last[x]=tot;}
inline int makehs(ull x)
{
int tmp=x%mod;
for(int i=last[tmp];i;i=e[i].pre)
if(e[i].too==x) return i;
add(tmp, x);
return tot;
}
inline int hs(ull x)
{
int tmp=x%mod;
for(int i=last[tmp];i;i=e[i].pre)
if(e[i].too==x) return i;
return -;
}
inline void update(int x1, int yy1, int x2, int y2)
{
ull tmp=;
tmp=tmp*+x1; tmp=tmp*+yy1; tmp=tmp*+x2; tmp=tmp*+y2;
if(hs(tmp)!=-) return;
makehs(tmp);
q.push((poi){x1, yy1, x2, y2, mp[x2][y2]-mp[x2][yy1-]-mp[x1-][y2]+mp[x1-][yy1-]});
}
int main()
{
scanf("%d%d%d%d%d", &n, &m, &mna, &mnb, &k);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
read(mp[i][j]), mp[i][j]+=mp[i-][j]+mp[i][j-]-mp[i-][j-];
for(int i=mna;i<=n;i++)
for(int j=mnb;j<=m;j++)
{
ull tmp=;
int x1=i-mna+, yy1=j-mnb+, x2=i, y2=j;
tmp=tmp*+x1; tmp=tmp*+yy1; tmp=tmp*+x2; tmp=tmp*+y2;
makehs(tmp);
q.push((poi){x1, yy1, x2, y2, mp[x2][y2]-mp[x2][yy1-]-mp[x1-][y2]+mp[x1-][yy1-]});
}
for(int i=;i<=k;i++)
{
if(q.empty()) return puts("-1"), ;
poi t=q.top(); q.pop();
int x1=t.x1, yy1=t.yy1, x2=t.x2, y2=t.y2;
if(x1>) update(x1-, yy1, x2, y2);
if(yy1>) update(x1, yy1-, x2, y2);
if(x2<n) update(x1, yy1, x2+, y2);
if(y2<m) update(x1, yy1, x2, y2+);
if(i==k) printf("%u\n", t.sum);
}
}

bzoj4165: 矩阵(堆+hash)的更多相关文章

  1. bzoj4165 矩阵 堆维护多路归并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4165 题解 大概多路归并是最很重要的知识点了吧,近几年考察也挺多的(虽然都是作为签到题的). ...

  2. 【bzoj4128】Matrix 矩阵乘法+Hash+BSGS

    题目描述 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) 输入 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B 输出 输出 ...

  3. 【bzoj4165】矩阵 堆+STL-map

    题目描述 定义和谐矩阵为长不小于 Mina 且宽不小于 Minb 的矩阵,矩阵的权值为整个矩阵内所有数的和.给定一个长为 N,宽为 M 的矩阵 A,求它的所有和谐子矩阵中权值第 K 小的矩阵,并输出它 ...

  4. bzoj4165: 矩阵

    Description 定义和谐矩阵为长不小于 Mina 且宽不小于 Minb 的矩阵,矩阵的权值为整个矩阵内所有数的和.给定一个长为 N ,宽为 M 的矩阵 A,求它的所有和谐子矩阵中权值第 K 小 ...

  5. BZOJ 4165 矩阵 堆

    先把每个长为$mina$,宽为$minb$的矩阵扔到堆里,然后由于矩阵中的数都是正的,所以我们每取出来一个矩形,,就把他向四个方向扩张一行,再把这新的且更大的四个矩形扔到堆里.注意判重,于是我比较懒用 ...

  6. day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树

    来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...

  7. Samjia 和矩阵[loj6173](Hash+后缀数组)

    传送门 本题要求本质不同的子矩阵,即位置不同也算相同(具体理解可以看样例自己yy). 我们先看自己会什么,我们会求一个字符串中不同的子串的个数.我们考虑把子矩阵变成一个字符串. 先枚举矩阵的宽度,记为 ...

  8. 矩阵hash + KMP - UVA 12886 The Big Painting

    The Big Painting Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=88791 M ...

  9. LA 6893 The Big Painting(矩阵Hash)

    https://vjudge.net/problem/UVALive-6893 题意: 给出一个小矩阵和大矩阵,在大矩阵中能找到相同的小矩阵. 思路: 矩阵Hash,先对小矩阵计算出它的Hash值,然 ...

随机推荐

  1. hdu1042 N!(大数求阶乘)

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submi ...

  2. exe4j 使用记录(二):jar打包exe

    一.环境 exe4j: 6.0.2 jre(32位): 1.8 二.打包过程 1.新建一个文件夹testExe(我的目录位置:D:\testExe)用来存放所需要打成exe的jar包.jdk或者jre ...

  3. nexus实现从windows迁移至Linux平台

    说明: 由于老环境是在本地windows 2008 R2里面搭建的nexus,前面搭建了jenkins,需要将maven私库迁移至云服务器的CentOS 7系统下,之前没做过nexus的迁移,在网上看 ...

  4. jvm之GC知识点

    GCRoots:        虚拟机栈(栈帧中的局部变量表)引用的对象       方法区中静态属性引用的对象       方法去中常量引用的对象       本地方法栈中JNI(NATIVE方法) ...

  5. centos 7 install gnome etc

    centos yum 有grouplist子命令,可以查看当前系统有多少软件组件,里面就有gnome:"GNOME Desktop" sudo yum groupinstall G ...

  6. 账号被锁无法ssh登陆

    Account locked due to failed logins 方法一: 使用root用户登陆后执行: pam_tally2 --user=username --reset 方法二: user ...

  7. 《机器学习实战》6.2小节,KKT条件代码理解

    <机器学习实战>6.2小节 #这句是检测 当前样本点i 是否满足KKT条件的 if (alphas[i, :] < C and E_i * labelMat[i, :] < - ...

  8. Amazon.com Seller Distributed Inventory Placement Inventory Placement Service

    Greetings, Thank you for writing to us. I understand that you would like to send inventory to our wa ...

  9. hibernate.hbm.xml文件配置入门小结(1)

    在Hibernate中,各表的映射文件xxx.hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具. hibernate.hbm.xml文件的基本结构如下 ...

  10. postman的巨坑 之 cookie

    问题描述:一个后端接口,该接口需要校验登录态,登录态通过cookie中的一个传参k判断.在保证登录的前提下,调用机器A上的接口一直报“用户未登录”,调机器B上就没问题,于是开始排查问题. 解决过程: ...