Description

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

Input

第 1 行为五个正整数,分别为 N , M , Mina , Minb , K,相邻两个数用一个空格分隔。接下来的 N 行,每行 M
 个用一个空格分隔的数,表示给定的矩阵 A。
1 <= N,M <=1000, 1 <= Mina <= N, 1 <= Minb <= M,
1 <= K <= 250000 ,矩阵 A 内每个数均为不超过 3000 的非负整数

Output

仅一行,一个数,表示第 K 小矩阵的权值。如果第 K 小矩阵不存在,输出-1。

由于矩阵内整数非负,若子矩阵P包含子矩阵Q则sum(P)>sum(Q)

最小的子矩阵长宽一定为(Mina , Minb),从最小的矩阵开始向外bfs,每个子矩阵可以向上/下/左/右扩展一行/列,注意判重

用堆维护搜索顺序,散列表维护一个状态是否出现过,第k个出堆的子矩阵为答案

#include<cstdio>
#include<cstdlib>
#include<queue>
const int P=,R=;
char buf[R],*ptr=buf-;
inline int _int(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int n,m,n1,m1,k;
unsigned int s[][],rnd[][];
struct data{
unsigned int x1,y1,x2,y2,sum;
data(){}
inline data(int _x1,int _y1,int _x2,int _y2):x1(_x1),y1(_y1),x2(_x2),y2(_y2){
sum=s[x2][y2]+s[x1][y1]-s[x2][y1]-s[x1][y2];
}
}w;
inline bool operator<(const data&a,const data&b){
return a.sum>b.sum;
}
inline bool operator==(const data&a,const data&b){
return a.x1==b.x1&&a.y1==b.y1&&a.y2==b.y2&&a.x2==b.x2;
}
std::priority_queue<data>q;
bool ins(data x){
static data xs[P];
static bool ed[P];
int w=rnd[x.x1][x.y1]^rnd[x.x2][x.y2];
while(ed[w]){
if(xs[w]==x)return ;
w+=;
if(w>=P)w-=P;
}
xs[w]=x;ed[w]=;
return ;
}
inline void push(data x){
if(ins(x))q.push(x);
}
int main(){
fread(buf,,R-,stdin);
srand();
n=_int();m=_int();n1=_int();m1=_int();k=_int();
for(int i=;i<=n;i++)for(int j=;j<=m;j++)s[i][j]=_int()+s[i][j-],rnd[i][j]=(rand()^rand()<<)&;
for(int i=;i<=n;i++)for(int j=;j<=m;j++)s[i][j]+=s[i-][j];
for(int i=n1;i<=n;i++)for(int j=m1;j<=m;j++)push(data(i-n1,j-m1,i,j));
for(int i=;i<k;i++){
if(q.empty()){
puts("-1");
return ;
}
w=q.top();q.pop();
if(w.x1)push(data(w.x1-,w.y1,w.x2,w.y2));
if(w.y1)push(data(w.x1,w.y1-,w.x2,w.y2));
if(w.x2!=n)push(data(w.x1,w.y1,w.x2+,w.y2));
if(w.y2!=m)push(data(w.x1,w.y1,w.x2,w.y2+));
}
printf("%u\n",w.sum);
return ;
}

bzoj4165: 矩阵的更多相关文章

  1. bzoj4165: 矩阵(堆+hash)

    求第k大用堆维护最值并出堆的时候扩展的经典题... 因为只有正数,所以一个矩阵的权值肯定比它的任意子矩阵的权值大,那么一开始把所有满足条件的最小矩阵加进堆里,弹出的时候上下左右扩展一行加进堆,用has ...

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

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

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

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

  4. C语言 · 矩阵乘法 · 算法训练

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

  5. 获取Canvas当前坐标系矩阵

    前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...

  6. CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换

    CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换 三维世界里的旋转(rotate),可以用一个3x3的矩阵描述:可以用(旋转角度float+旋转轴vec3)描述.数学家欧拉证明了这两种形式可 ...

  7. “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”

    0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...

  8. js实现蛇形矩阵

    参加腾讯前端实习生笔试,真的是被虐了千百遍,除了一条js程序题,其他半点前端都没有,都是考算法,计算机原理,数据结构.下面贴上腾讯笔试最后三大条中的一条,实现一个蛇形矩阵的输出.蛇形矩阵的什么样这里我 ...

  9. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

随机推荐

  1. sql server 内置ETL工具学习(一) BCP篇

    sql server 内置ETL工具学习 常用的导入方式:bcp, BULK INSERT,OPENROWSET和 SSIS. BCP BCP全称BULK COPY PROGRAM 有以下特点: 命令 ...

  2. 自动构建Makefile(1)--C/C++编译流程&Makefile规则简介

      前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建 ...

  3. FTP方式获取文件步骤

    1.在浏览器地址行输入FTP连接地址 2.进入FTP端之后,点击“檢視”-“在windows資源總覽中開啟FTP站臺”,這樣就可以打開FTP端的文件了

  4. WebApp远程调试工具

    针对存在内嵌在客户端的webview项目中,在开发过程中我们希望能像PC上一下直接进行调试,提高我们平时的开发效率,这时候我们可以使用webApp远程调试工具-weinre. 安装: 本工具需要nod ...

  5. 转:SQL:外连接on条件与where条件的区别

    原文地址:http://hi.baidu.com/benben1006/blog/item/187deb77bc0e5319b151b974.html 数据库在通过连接两张或多张表来返回记录时,都会生 ...

  6. leetcode 153. Find Minimum in Rotated Sorted Array --------- java

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  7. ubuntu 14.04 apache maven 安装

    下载maven http://maven.apache.org/download.cgi  解压 tar -xzvf apache-maven-3.0.5-bin.tar.gz -C /usr/loc ...

  8. 数据库实验一 SQL Service的安装

    SQL 2014 安装需要 Microsoft .Net Framework 3.5框架 win 8.1 Microsoft .Net Framework 3.5框架安装教程:点我 安装图文教程:点我 ...

  9. poj2186 强连通

    题意:有 n 头牛,以及一些喜欢关系,牛 A 喜欢牛 B,这种关系可以传递,问有多少头牛被牧场上所有牛喜欢. 首先强连通,因为在同一个强连通分量中牛是等价的,然后对于一个有向无环图看是否只有一个强连通 ...

  10. E:nth-child(n)实现奇偶匹配

    <style> li:nth-child(2n){color:#f00;} /* 偶数 */ li:nth-child(2n+1){color:#000;} /* 奇数 */ </s ...