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}\} 1≤i,j≤m∑1≤k≤3max{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 1≤i,j≤n 且 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,j≤a1,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,j≤a1,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}) 1≤i,j≤n∑{[b2,i+b2,j≤0, b3,i+b3,j≤0]}(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,j−a1,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} ∑1≤i,j≤n{[b2,i+b2,j≤0, b3,i+b3,j≤0]}×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,j≤0, b3,i+b3,j≤0 的个数。而显然这是个二维偏序问题,可以排序后使用动态开点线段树解决,或在排序,二分定位后用树状数组解决。
于是我们解决了 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(mnlognm−2) 的。
如果使用 K-D Tree,那么时间复杂度就是 O ( m n m − 1 m − 2 ) O(mn^{\frac {m-1} {m-2}}) O(mnm−2m−1) 的(逃
Code
咕咕咕