\(\text{Problem}\)

\(\text{Solution}\)

纪念我考场正解被二分暴力暴踩。。。

首先二分的话,显然可以二分出答案,然后数矩阵和大于等于本矩阵的是否有 \(k\) 个

加一些优化就可以 \(AC\)?!!

不管它,正解就是让矩阵行列大小从小到大扩展,矩阵和小一些的肯定已经出来了

做 \(k\) 次即可,注意判重

本人手打哈希表+手打堆,因为数组开小光荣 \(\text{RE} 80pts\)

欲哭无泪

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#define LL long long
#define re register
#define register
using namespace std; const int N = 1005, mod = 1e6 + 7;
int n, m, ma, mb, k, a[N][N];
LL s[N][N]; inline void read(int &x)
{
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
} struct Hash{int x, y, nxt;}e[mod * 2 + 5];
int ht[mod + 5], tot;
inline void insert(int x, int y)
{
int key = (10000000LL * x + y) % mod;
e[++tot] = Hash{x, y, ht[key]}, ht[key] = tot;
}
inline int query(int x, int y)
{
int key = (10000000LL * x + y) % mod;
for(re int i = ht[key]; i; i = e[i].nxt)
if (e[i].x == x && e[i].y == y) return 1;
return 0;
} struct node{int x0, y0, x1, y1; LL s;};
struct Heap{
int size;
node h[N * N * 2]; inline int check(int x, int y)
{
if (x > 0 && y > 0 && x <= n && y <= m) return 1;
return 0;
}
inline int Num(int x, int y){return (x - 1) * m + y;}
inline node top(){return h[1];}
inline void pop(){h[1] = h[size--], down(1);} inline void up(int x){while (x > 1 && h[x].s < h[x >> 1].s) swap(h[x], h[x >> 1]), x >>= 1;}
inline void down(int x)
{
while (((x << 1) <= size && h[x].s > h[x << 1].s) || ((x << 1 | 1) <= size && h[x].s > h[x << 1 | 1].s))
{
int y = x << 1;
if (h[y | 1].s < h[y].s) y |= 1;
swap(h[x], h[y]), x = y;
}
} inline void push(node c)
{
if (!(check(c.x0, c.y0) && check(c.x1, c.y1))) return;
if (query(Num(c.x0, c.y0), Num(c.x1, c.y1))) return;
insert(Num(c.x0, c.y0), Num(c.x1, c.y1));
c.s = s[c.x1][c.y1] - s[c.x0 - 1][c.y1] - s[c.x1][c.y0 - 1] + s[c.x0 - 1][c.y0 - 1];
h[++size] = c;
up(size);
}
}T; int main()
{
read(n), read(m), read(ma), read(mb), read(k);
for(re int i = 1; i <= n; i++)
for(re int j = 1; j <= m; j++)
read(a[i][j]), s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
for(re int i = 1; i <= n - ma + 1; i++)
for(re int j = 1; j <= m - mb + 1; j++) T.push(node{i, j, i + ma - 1, j + mb - 1});
LL ans = -1; node now;
for(re int i = 1; i <= k; i++)
{
now = T.top(), T.pop();
if (i == k){ans = now.s; break;}
T.push(node{now.x0, now.y0, now.x1, now.y1 + 1});
T.push(node{now.x0, now.y0, now.x1 + 1, now.y1});
}
printf("%lld\n", ans);
}

JZOJ 4754.矩阵的更多相关文章

  1. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  2. Q矩阵输出

    程序启动时: 1.Q矩阵在InitQX中对角阵赋初值为0.25,GPS卫星数6 2.Q矩阵初值在初始化时由GetBL获得,改变Q对角阵 Q初值第0个卫星 10000000000.000 X初值第0个卫 ...

  3. jzoj2701 【GDKOI2012模拟02.01】矩阵

    传送门:https://jzoj.net/senior/#main/show/2701 [题目大意] 给出矩阵A,求矩阵B,使得

  4. 2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解

    2019中山纪念中学夏令营-Day20[JZOJ] 提高组B组 Team_B组 T1 旅游 Time Limits: 2000 ms  Memory Limits: 262144 KB Descrip ...

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

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

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

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

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

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

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

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

  9. js实现蛇形矩阵

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

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

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

随机推荐

  1. Day26:内部类的详解

    内部类 1.1内部类概述 内部类:就是在一个类中定义另外一个类. 例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类. 好比我们的手机是一个类,而手机内部的零件又属于一个类. 内 ...

  2. vba 数组判断与转换

    Private Function CountArr(arr)'*****************************'计算数组是几维数组'***************************** ...

  3. pycharm全局搜索

    方法有:1.使用[Ctrl+N]快捷键按文件名搜索py文件: 2.使用[Ctrl+shift+N]快捷键按文件名搜索所有类型的文件: 3.使用[ctrl+shift+f]快捷全局字符串搜索: 3.使用 ...

  4. python什么是异常?如何处理异常

    异常处理 什么是异常 异常是程序错误发生的信号.程序一旦出现错误,就会产生一个异常,如果程序中没有处理该异常,该异常就会抛出来,程序的运行也随即终止. 错误分为两种 1.语法错误 2.逻辑错误 如何处 ...

  5. ArcObjects SDK开发 017 在ArcObject SDK 中使用Toolbox

    1.Geoprocessor和IGPProcess Geoprocessor是ArcObjects SDK中定义Tool执行器.IGPProcess接口是ArcObjects SDK中定义的ArcTo ...

  6. nuxt.js框架 如何打包 build

    nuxt脚手架开发好项目后怎么打包 以下是脚手架的package.json部分代码 "scripts": { "dev": "cross-env NO ...

  7. ESXI 7.0封装网卡驱动

    前段时间配置的All In One 主机,由于华擎H410M-ITX/AC主板的板载网卡为intel I219-V,在安装ESXI后网卡无法驱动.查询之后发现原来ESXI7.0.2的版本不含该网卡驱动 ...

  8. P8474 「GLR-R3」立春

    简要题意 \(\tau(\sigma)\) 表示排列 \(\sigma\) 的逆序对个数,求: \[\sum_{i \in \operatorname{permutation(n)}}2^{\tau( ...

  9. 02-RTL代码分析思路

    RTL代码分析思路(这里不进行具体代码的分析) verilog文件是以.v结尾的 1 RTL代码示例 //Date : 2023-01-09 //E-mail : xxxxxx@163.com //c ...

  10. group by 语句怎么优化?

    一.一个简单使用示例 我这里创建一张订单表 CREATE TABLE `order_info` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `or ...