【NOI Online 2022 提高组 C】【洛谷 P8252 】如何正确地排序题解

Description

传送门

Solution

首先考虑将 min ⁡ , max ⁡ \min,\max min,max 给拆开。二者同理,我们不妨仅考虑求前者。

对于 m = 2 m=2 m=2 的情况可以随便做。下面我们先考虑 m = 3 m=3 m=3 的情况。

首先,明确所要求即 ∑ 1 ≤ i , j ≤ m max ⁡ 1 ≤ k ≤ 3 { a k , i + a k , j } \sum_{1 \le i,j \le m} \max_{1 \le k \le 3}\{a_{k,i}+a_{k,j}\} 1i,jm1k3max{ak,i+ak,j}

不难想到给所有的 a k , i + a k , j a_{k,i}+a_{k,j} ak,i+ak,j 钦定一个唯一的最大值。换言之,我们需要加入第二个关键字。于是,我们不妨把 k k k 作为第二关键字,钦定在 a k , i + a k , j a_{k,i}+a_{k,j} ak,i+ak,j 相同时较小的 k k k 被计入 max ⁡ \max max 中。

我们枚举一行,并计算该行对答案的总贡献。假设枚举到的是第一行,那么我们要对于每一对满足 1 ≤ i , j ≤ n 1 \le i,j \le n 1i,jn a 2 , i + a 2 , j ≤ a 1 , i + a 1 , j a_{2,i}+a_{2,j} \le a_{1,i}+a_{1,j} a2,i+a2,ja1,i+a1,j a 3 , i + a 3 , j ≤ a 1 , i + a 1 , j a_{3,i}+a_{3,j} \le a_{1,i}+a_{1,j} a3,i+a3,ja1,i+a1,j ( i , j ) (i,j) (i,j) 求出 a 1 , i + a 1 , j a_{1,i}+a_{1,j} a1,i+a1,j 之和。通过一系列简单的转化,该问题可以被转化为求

∑ 1 ≤ i , j ≤ n { [ b 2 , i + b 2 , j ≤ 0 ,   b 3 , i + b 3 , j ≤ 0 ] } ( a 1 , i + a 1 , j ) \sum_{1 \le i,j \le n} \{[b_{2,i}+b_{2,j} \le 0,\ b_{3,i}+b_{3,j} \le 0]\}(a_{1,i}+a_{1,j}) 1i,jn{[b2,i+b2,j0, b3,i+b3,j0]}(a1,i+a1,j)

其中 b i , j = a i , j − a 1 , j b_{i,j}=a_{i,j}-a_{1,j} bi,j=ai,ja1,j

进一步推导得到,原式等于 ∑ 1 ≤ i , j ≤ n { [ b 2 , i + b 2 , j ≤ 0 ,   b 3 , i + b 3 , j ≤ 0 ] } × a 1 , i \sum_{1 \le i,j \le n} \{[b_{2,i}+b_{2,j} \le 0,\ b_{3,i}+b_{3,j} \le 0]\} \times a_{1,i} 1i,jn{[b2,i+b2,j0, b3,i+b3,j0]}×a1,i两倍。所以关键在于求出上式。

考虑枚举 i i i,那么我们要求出满足 b 2 , i + b 2 , j ≤ 0 ,   b 3 , i + b 3 , j ≤ 0 b_{2,i}+b_{2,j} \le 0,\ b_{3,i}+b_{3,j} \le 0 b2,i+b2,j0, b3,i+b3,j0 的个数。而显然这是个二维偏序问题,可以排序后使用动态开点线段树解决,或在排序,二分定位后用树状数组解决。

于是我们解决了 m = 3 m=3 m=3 的情况,那么 m = 4 m=4 m=4 该怎么办呢?

Part 1

不难发现 m = 4 m=4 m=4 时是一个三维偏序问题,可以使用 cdq 分治或可持久化树套树解决,时间复杂度 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)

Part 2

发现无论如何做似乎都需要三维偏序。于是我们不妨驻足观赏一下我们的佳作,查找一下我们是否在过程中漏掉了些许性质。

可以发现,我们在最开始的第一步就把 min ⁡ \min min max ⁡ \max max 拆开了。一些性质似乎随着这二者的拆开而消失了。那么如果不拆开呢?

假设 ∀ k , a k , i + a k , j \forall k,a_{k,i}+a_{k,j} k,ak,i+ak,j 在经过双关键字排序后的先后顺序为 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4,那么需要贡献进答案的就是 k 1 , k 4 k_1,k_4 k1,k4 对应的值。不过 k 1 , k 4 k_1,k_4 k1,k4 在角落上,要确保它们最值的地位,需要确保其他三个都要比它大而比它小;但如果我们容斥地计算 k 2 , k 3 k_2,k_3 k2,k3 的贡献呢?这是不是会好一点呢?通过思考,可以发现,如果我们枚举三行,钦定其中的一行在排序后卡在了另两者之间,并暂时贡献进答案,那么 k 2 , k 3 k_2,k_3 k2,k3 会被分别计算 2 2 2 次。于是,我们只要将答案除以二,再用总数减它不就好了!!1

于是,问题最终被转化回了一个二维偏序问题,可以轻松解决。注意到枚举三行之后还要钦定这三行的顺序,所以需要做 A 4 3 = 24 A_4^3=24 A43=24 次二维偏序,所以时间复杂度是 O ( 24 n log ⁡ n ) O(24 n \log n) O(24nlogn) 的,基本上可以认为是 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n) 的。所以不见得 Part 2 就比 Part 1 的时间复杂度优秀,但是不得不说可能更妙一点,更好写(卡不卡常口胡选手才不管呢)吧。

扩展

如果 m = 5 , m = 6 m=5,m=6 m=5,m=6 呢?

我很菜,觉得 Part 2 的做法在 m = 5 m=5 m=5 的时候似乎完全不适用了。不过 Part 1 的做法的确是可以无限地扩展下去的。

如果使用多维树套树,那么时间复杂度就是 O ( m n log ⁡ n m − 2 ) O(mn \log n^{m-2}) O(mnlognm2) 的。

如果使用 K-D Tree,那么时间复杂度就是 O ( m n m − 1 m − 2 ) O(mn^{\frac {m-1} {m-2}}) O(mnm2m1) 的(逃

Code

咕咕咕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值