problem

算法1

我会暴力!!!

直接枚举右上角和左下角,然后计算答案,使用前缀和优化后时间复杂度为 \(O(n^4)\)。

算法2

我会分治!!!。

我们知道答案就是左边+右边+两边都有的个数。

左右递归求解即可,所以考虑两边都有的个数。

我们知道满足有 \(k\) 个 \(1\) 的可能为上面有 \(i\) 个点,下面有 \(k - i\) 个点,\(i \in [0,k]\)。于是我们可以考虑维护上面的矩阵有 \(i\) 个点的情况数。

先枚举左右端点,表示我们想要求的矩阵的左右两边。

对于每一个宽度我们会考虑到底有多少个矩阵有 \(i\) 个 \(1\)。于是定义 \(up_{0,i}\) 为在规定左右两边的情况下上边界到 \(mid\) 的矩阵中的 \(1\) 的个数 \(<i\) 的最大值。同理定义 \(up_{1,i}\) 为在规定左右两边的情况下 \(mod\) 到下边界的矩阵中的 \(1\) 的个数 \(<i\) 的最小值。

于是我们就知道上边界到 \(mid\) 组成的矩阵中有 \(i\) 个 \(1\) 的个数为 \(up_{0,i} - up_{0,i + 1}\)。

所以我们可以暴力的去求解这个值,由于左右两边会移动,所以我们的 \(up\) 数组也在变化。假如我们每一次都遍历一遍去 \(up\) 数组,那是肯定会超时的,考虑优化。

我们先来研究当右端点往后一一位后 \(up\) 的变化。在这里我就以 \(up_0\) 为例,\(up_1\) 同理。

1.后面那一列并没有任何 \(1\)

很明显他是不会变的,这应该可以理解吧。所以左端点为 \(i\),右端点为 \(j\) 对应的 \(up_{0,k}\) 就等于左端点为 \(i\),右端点为 \(j + 1\) 对应的 \(up_{0,k}\)。

2.后面那一列有 \(1\)

我们可以画个图来感性理解一下。

我们发现这个数下降了,但是这个数还有可能是不变的,这个情况就留给读者自己构造。

综上左端点为 \(i\),右端点为 \(j\) 对应的 \(up_{0,k}\) 小于等于左端点为 \(i\),右端点为 \(j + 1\) 对应的 \(up_{0,k}\)。

\(up_1\) 也是如此。

所以我们就知道 \(up\) 数组拥有单调性。于是我们就可以像单调队列一样去维护 \(up\) 数组了。

求出 \(up\) 数组后,本题就很简单了,答案就是上面的矩阵有 \(i\) 个点的情况 \(\times\) 下面的矩阵有 \(k - i\) 个点的情况。

二维分治有两种写法,第一种是横着劈一刀,然后竖着劈一刀,还有一种就是每一次都劈两条边中更长的那条长的。

上面讲的 \(up\) 的维护方法是横着劈的,竖着劈同理。

时间复杂度为 \(O(knm \log n)\)。

code

随机推荐

  1. 第四課-Channel Study File Reader & File Writer

    示例描述:从数据库中读取数据并过滤转换为HL7并存放到指定目录;然后读取目录中的HL7文件转换为txt文本并存放到指定目录. 首先在F:\MirthConnect\Test目录下创建Out目录存放输出 ...

  2. HarmonyOS NEXT应用开发—翻页动效案例

    介绍 翻页动效是应用开发中常见的动效场景,常见的有书籍翻页,日历翻页等.本例将介绍如何通过ArkUI提供的显示动画接口animateTo实现翻页的效果. 效果图预览 使用说明 本例通过setInter ...

  3. 当 Knative 遇见 WebAssembly

    简介: Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时. 作者:易立 Knative 是在 Kubern ...

  4. 企业版Spark Databricks + 企业版Kafka Confluent 联合高效挖掘数据价值

    ​简介:本文介绍了如何使用阿里云的Confluent Cloud和Databricks构建数据流和LakeHouse,并介绍了如何使用Databricks提供的能力来挖掘数据价值,使用Spark ML ...

  5. 如何合理使用 CPU 管理策略,提升容器性能?

    ​简介:CPU Burst.拓扑感知调度是阿里云容器服务 ACK 提升应用性能的两大利器,它们解决了不同场景下的 CPU 资源管理,可以共同使用.点击下文,查看详情! 作者:张佐玮(佑祎) 前言 在云 ...

  6. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

    ​简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选.不过 Jenkins 存在维护成本高.配置复杂等缺点,云效 Flow 较好地解决了这些问题. 本 ...

  7. Hologres揭秘:高性能原生加速MaxCompute核心原理

    简介: Hologres技术揭秘系列持续更新中,本期我们将带来Hologres高性能原生加速查询MaxCompute的技术原理解析. Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓, ...

  8. WPF 基础 2D 图形学知识 判断点是否在线段上

    在知道一个使用两个点表示的线段,和另一个点,求另一个点是否在线段上 本文算法属于通用的算法,可以在 WPF 和 UWP 和 Xamarin 等上运行,基本上所有的 .NET 平台都能执行 如下图,如果 ...

  9. localstory,sessionstory,vuex,cook

    函数式组件 1.特点 没有this(没有实例) 没有响应式数据 它只是一个接受一些 prop 的函数. render MVVM分为Model.View.ViewModel三者. Model:代表数据模 ...

  10. 程序是怎样跑起来的_第一章-对程序员来说CPU是什么

    通过对第一章的学习,我了解了大体上CPU可以说是电脑的"大脑",即中央处理器.从功能来看可以分为寄存器,控制器,运算器和时钟.在这四个部分中,寄存器是最值得程序员注意的.总的来说, ...