bzoj4165: 矩阵(堆+hash)
求第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)的更多相关文章
- bzoj4165 矩阵 堆维护多路归并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4165 题解 大概多路归并是最很重要的知识点了吧,近几年考察也挺多的(虽然都是作为签到题的). ...
- 【bzoj4128】Matrix 矩阵乘法+Hash+BSGS
题目描述 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) 输入 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B 输出 输出 ...
- 【bzoj4165】矩阵 堆+STL-map
题目描述 定义和谐矩阵为长不小于 Mina 且宽不小于 Minb 的矩阵,矩阵的权值为整个矩阵内所有数的和.给定一个长为 N,宽为 M 的矩阵 A,求它的所有和谐子矩阵中权值第 K 小的矩阵,并输出它 ...
- bzoj4165: 矩阵
Description 定义和谐矩阵为长不小于 Mina 且宽不小于 Minb 的矩阵,矩阵的权值为整个矩阵内所有数的和.给定一个长为 N ,宽为 M 的矩阵 A,求它的所有和谐子矩阵中权值第 K 小 ...
- BZOJ 4165 矩阵 堆
先把每个长为$mina$,宽为$minb$的矩阵扔到堆里,然后由于矩阵中的数都是正的,所以我们每取出来一个矩形,,就把他向四个方向扩张一行,再把这新的且更大的四个矩形扔到堆里.注意判重,于是我比较懒用 ...
- day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树
来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...
- Samjia 和矩阵[loj6173](Hash+后缀数组)
传送门 本题要求本质不同的子矩阵,即位置不同也算相同(具体理解可以看样例自己yy). 我们先看自己会什么,我们会求一个字符串中不同的子串的个数.我们考虑把子矩阵变成一个字符串. 先枚举矩阵的宽度,记为 ...
- 矩阵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 ...
- LA 6893 The Big Painting(矩阵Hash)
https://vjudge.net/problem/UVALive-6893 题意: 给出一个小矩阵和大矩阵,在大矩阵中能找到相同的小矩阵. 思路: 矩阵Hash,先对小矩阵计算出它的Hash值,然 ...
随机推荐
- 【转】自动化测试 - Appium + Python史上最全最简环境搭建步骤
一,为什么是Appium借一张图: 1.1 Appium优点 l 开源 l 跨架构:NativeApp.Hybird App.Web App l 跨设备:Android.iOS.Firefox ...
- IDEA 配置Junit4
Junit4 主要用来执行java程序的单元测试: 1 安装junit4插件 因为我安装过了,没有安装的再输入框搜索,然后安装就行 2 选择默认使用Junit4 3 红框中的test去掉,变为“$en ...
- Python如何判断变量的类型
Python判断变量的类型有两种方法:type() 和 isinstance() 如何使用 对于基本的数据类型两个的效果都一样 type() ip_port = ['219.135.164.245', ...
- HTML/CSS的基本使用
本篇博客主要介绍一下HTML/CSS的基本使用,关于它们的介绍便不在赘述,读者可自行google或百度. 一.HTML 先来简单介绍一下HTML标签: HTML 标签是由尖括号包围的关键词,比如 &l ...
- MySQL Proxy和 Amoeba 工作机制浅析
MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...
- MySQL 中的数据类型介绍
1.MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 2.数值类型(12) 2.1. ...
- 欢迎来怼——第四次Scrum会议
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/16 17:15~17:40,总计25min.地点:东北师范 ...
- Python:Python的运行过程
1.Python是什么 和Java以及c#一样,Python也是一门基于虚拟机的语言.熟悉Java开发的人在命令行执行一个Java程序的过程通常如下: javac hello.java java he ...
- "感应锁屏"Alpha版使用说明
“感应锁屏”Alpha版使用说明 一.产品介绍 感应锁屏是锁屏软件的一大创新.相比传统的锁屏软件,“感应锁屏”从可操作性.方便性.功能全面性都有了很大的提升,可以让用户方便快捷的进行锁屏操作. “感应 ...
- 关于C语言的问卷调查!!!!!!!!!!
1.我对自己的未来是现在通过大学这一平台逐渐接触社会,通过大学的这段时间学习C语言等计算机语言技术,有一技之长在手,并且通过大学时间丰富自己的业余生活,加强自己的人脉关系,为未来在事业上的发展做准备! ...