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. js实现简单易用的上下无缝滚动效果

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Spring初始化 Map 和 解析Json value

    单独定义Map数据结构的bean: <bean id= "expToLevelMap" class="org.springframework.beans.facto ...

  3. ES6 — 新增关键字let、const

    ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScri ...

  4. 计算机算法-C语言-统计字母数字个数解

    Question:输入一串以“?”结尾的字符,分别统计其中字母数字的个数,输出字母及数字的个数. Solve: #include<stdio.h> #include<stdlib.h ...

  5. jQuery 鼠标滚轮插件应用 mousewheel

    jQuery Mousewheel Plugin,用于添加跨浏览器的鼠标滚轮支持. mousewheel事件的处理函数有一点小小的变化,它除了第一个参数event 外,还接收到第二个参数delta. ...

  6. (转) An overview of gradient descent optimization algorithms

    An overview of gradient descent optimization algorithms Table of contents: Gradient descent variants ...

  7. 论文笔记之:Generative Adversarial Nets

    Generative Adversarial Nets NIPS 2014  摘要:本文通过对抗过程,提出了一种新的框架来预测产生式模型,我们同时训练两个模型:一个产生式模型 G,该模型可以抓住数据分 ...

  8. JSBinding + SharpKit / 原理篇:Delegate

    以 NGUI 的 UIEventListener 为例: 有一个类: using SharpKit.JavaScript; using UnityEngine; using System.Collec ...

  9. CUDA Thread Indexing

    1D grid of 1D blocks __device__ int getGlobalIdx_1D_1D() { return blockIdx.x *blockDim.x + threadIdx ...

  10. Wireshark-BPF过滤规则

    设置过滤规则就是让网络设备只是捕获我们感兴趣的网络数据包,如果没有设置过滤规则,即上面的 filter_app 是空字符串,那么网络设备就捕获所有类型的数据包,否则只是捕获过滤规则设置的数据包,此时过 ...