P6774 时代的眼泪
名人名言#
一道非常优秀的分块入门题,值得分块初学者花时间思考,不值得一写。
——
Section -1#
好吧,虽然前半句令人不适,后半句说的还是挺对的。
NOI 2020 之后就一直想切这个题……没办法,谁叫我是时代的眼泪呢……
一开始一直沿用 Yuno loves sqrt tech I 的方法做这题,最后发现虽然有一些迁移性,但还是有较大差异的。
如果您没有切 Yuno loves sqrt tech I,强烈建议你先去做那个题,至少口胡一遍。
由于下标会比较多,本文在超过一个下标的时候会采用多元函数形式表示数组,以拯救笔者和读者的眼睛。
Section 0#
-
定义 : 这个询问的答案。
-
定义 :第 到 块块间答案。
-
定义 :块的最左边。
-
规定下文的 只包含 内的整数。
Section 1#
序列分块,块长 ,序列内离散化。
Section 2#
接下来的套路就比较寻常了,我们先把左右散块分开得到一张经典图。
然后不难发现有三种块间贡献:散块对整块(红 蓝),整块对散块(蓝 绿),散块对散块(红 绿),整块对整块(一块中的蓝 另一块的蓝)。
然后不难发现除了这几种贡献,我们还有散块和整块间(同块 同块)的贡献,一共 种。
这六种贡献加起来,就是答案了(如果左右端点在同块则只记为一个散块统计)。
接下来我们一个一个来算。
Section 3#
我们先考虑散块内部的贡献。
现在的规模已经变成 了(即下标,值域都 ),因此可以暴力记录 的数中小于等于 的有几个。
- 定义 为 的块内从小到大排名。
- 定义 为 中 小于 的数的数量。
我们对于每一块都预处理这一块的 数组,一个块的复杂度为 ,总复杂度为 。
然后我们可以拆 。
稍微推一下就可以得到 。单次询问复杂度 。
Section 4#
散块对散块的贡献。
这类是最简单的,由于两边都只有 个数,提取出来排序后归并计算顺序对即可。如果我们对每块预先根据值排序,然后只对所有数判断是否需要提取出来,单次询问复杂度就可以消掉 ,即 。这个 trick 和 Yuno loves sqrt tech I 是一样的,具体可以看这张图。
Section 5#
整块对整块的贡献。
由于只有 个块,我们还是可以暴力。
- 定义 为前 块中小于等于 的数的个数。
预处理的时间复杂度为 。
然后我们根据散块间贡献那个式子的形式分解一下,假设我们求第 块的贡献。
。
其中 代表 块中 的数的个数, 代表第 块 的数的个数。由于 和 已经处理好了,于是后面的东西可以 算。
而前面我们就要再次利用之前的一个性质了:一个块只有 种不同的数。我们将 数组转化成块内贡献。
- 定义 为 所在块之前的所有数中小于 这块从小到大第 个数的数量。
- 定义 为在 所在块所有元素中比 小的最大元素的从小到大排名。
不难发现并不需要预处理 ,可以根据 在 中查询, 可以单块 处理,总时间复杂度 。
有了这两项,我们就可以预处理 了。
- 定义 为 块与第 块从小到大前 个元素组成的逆序对数量。
显然 ,然后这玩意可以前缀和,单块 ,整体 。
,因此单次询问 。
Section 6#
散块对整块的贡献和整块对散块的贡献。
这两部分并不难,由于只有 个数,我们只要判断每个数和中间的所有整块能组成的逆序对即可。
我们可以将所有整块中 的出现次数用 在 的时间内求出来,对于散块中的数一个一个求逆序对数量即可,单次询问 。
Section 7#
整块块内的贡献。
由于 和 在每块离散化之后只有 种选择,所以我们考虑把所有情况都算出来。
- 定义 为第 块取从小到大第 到 个元素组成的逆序对数量。
这部分是可以通过 暴力预处理的,单块 ,总时空复杂度 。
Section 8#
综上,我们在 的时空复杂度内在线解决了这个问题……
这个题实现起来逻辑清晰,但是代码有一点点细节和一点点长度,在洛谷上有一点点卡常。
为了卡常我特判了第 个数据点并在那个点用了 Yuno loves sqrt tech II 的代码。
然而如果您不像我一样人傻常数大应该马上就能卡过去吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律