\(\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. 3. qtdesinger的使用方法

    专栏地址 ʅ(‾◡◝)ʃ windows 上使用 qtdesigner 找到那个路径直接打开就行了 linux 上使用 qtdesigner 打开 qtcreator 软件 1. 启动软件,新建项目 ...

  2. 《MySQL必知必会》知识汇总二

    六.用通配符进行过滤 本章介绍什么是通配符.如何使用通配符以及怎样使用LIKE操作符进行通配搜索 LIKE操作符 百分号(%)通配符 select prod_id,prod_name from pro ...

  3. Java的两大、三类代理模式

    简述 代理,是一种设计模式,主要作用是为其他对象提供一种代理,以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 主要分 ...

  4. whistle证书过期或不信任

    1. 安卓设备 , whistle抓包https安装证书后无法访问网络,报证书过期或不信任 2. 查看证书日期是到2030年,没有过期 3. 删除证书 重新安装时候证书选择 "VPN或应用& ...

  5. 使用 SSH 连接 Git 服务器

    关于 SSH SSH (Secure Shell) 是一种安全的远程登录协议,可以让你通过安全的加密连接进行远程登录.目前,Mac.Windows 10.Linux 系统均有内置 OpenSSH 客户 ...

  6. <二>vector向量容器

    底层数据结构:动态开辟的数组,每次以原始空间2倍扩容 vector vec; 增加 vec.push_back(100);容器末尾加元素 时间负责度O(1) 可能导致容器扩容 容器中的,对象的构造析构 ...

  7. pymysql.err.ProgrammingError: (1146, "Table 'autoplatform.webcasestepinfo' doesn't exist"

    在使用jmeter调试接口时,提示pymysql.err.ProgrammingError: (1146, "Table 'autoplatform.webcasestepinfo' doe ...

  8. paozhu c++ web framework 框架原理

    paozhu c++ web framework 框架原理 paozhu c++ web framework 使用 asio 网络库,如果用动态库方式还要boost库. paozhu框架 使用两个线程 ...

  9. 第三章 --------------------XAML的属性和事件

    1.XAML注释是什么样子的? 在之前的章节有提起过,但是这一节我还是想系统的学习XAML,XAML的注释如下 <!-- //这其中填写注释 --> Notice:在注释的部分编译器是不编 ...

  10. 11、ON DUPLICATE KEY UPDATE实现插入更新操作

    一.插入与更新操作: MySQL中,采用ON DUPLICATE KEY UPDATE语句对不存在的数据进行INSERT插入操作,对已存在的数据进行UPDATE更新操作: 总结: 1.ON DUPLI ...