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值,然 ...
随机推荐
- Python接口测试实战5(下) - RESTful、Web Service及Mock Server
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Zookeeper--java操作zookeeper
如果是使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 zkclien ...
- 高可用Kubernetes集群-6. 部署kube-apiserver
八.部署kube-apiserver 接下来3章节是部署Kube-Master相关的服务,包含:kube-apiserver,kube-controller-manager,kube-schedule ...
- Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)
Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级.在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级.linux 内核版本为 ...
- php分页类学习
分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据.在互联网上,分页是一般用于搜索结果或是浏览全部信息(比如:一个论坛主题).几乎在每一个W ...
- AVL树 算法思想与代码实现
AVL树是高度平衡的二叉搜索树,按照二叉搜索树(Binary Search Tree)的性质,AVL首先要满足: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不为空, ...
- mininet实验 可视化界面形成拓扑
参考博客一 参考博客二 实验目的 mininet中内置了一个mininet可视化工具:miniedit.miniedit在mininet/mininet/examples目录下提供miniedit.p ...
- DP--HDU 1003(最大子串和)
问题描述: 给定整数A1, A2,--AN (可能有负数),求I到j的最大值. 例如: -2, 11, -4, 13, -5, -2时答案为20 对于这个问题的算法 ...
- zuoyeQAQ
public class StringAPIDemo { /** * @param args */ public static void main(String[] args) { // TODO A ...
- smokping的部署使用
本文是介绍如何的使用smokeping来监控idc机房的网络质量情况,从监控图上的延时与丢包能分辨出你机房的网络是否稳定,是否为多线,是否为BGP机房,到各城市的3个运行商网络各是什么情况,如果出现问 ...