阅读须知
本文章仅提供解题思路!
题意
给定长度为 n n n 的非负整数序列 a a a,求
∑ l = 1 n ∑ r = l n f ( l , r ) \sum^n_{l=1}\sum^n_{r=l}f(l,r) l=1∑nr=l∑nf(l,r)
,其中 f ( l , r ) f(l,r) f(l,r) 表示从 a a a 序列的区间 [ l , r ] [l,r] [l,r] 选择若干不相邻的数的和的最大值。结果对 1 0 9 + 7 10^9+7 109+7 取模。
- 原题链接:P7482 不条理狂诗曲
思路
求所有区间的权值和提示我们使用分治。
考虑分治。设当前处理的区间为 [ l , r ] [l,r] [l,r],令 m i d = ⌊ l + r 2 ⌋ mid=\lfloor\dfrac{l+r}{2}\rfloor mid=⌊2l+r⌋,我们将子区间分为三种:
- 左右端点都在 [ l , m i d ] [l,mid] [l,mid] 上;
- 左右端点都在 [ m i d + 1 , r ] [mid + 1,r] [mid+1,r] 上;
- 左端点在 [ l , m i d ] [l,mid] [l,mid] 上,右端点在 [ m i d + 1 , r ] [mid + 1,r] [mid+1,r] 上。
前两种子区间可以分治递归求解。对于第三种子区间,我们令 f 0 L f0_L f0L 表示以 L L L 开始不取 m i d mid mid 时 [ L , m i d ] [L,mid] [L,mid] 的最大权值, f 1 L f1_L f1L 表示以 L L L 开始取 m i d mid mid 时 [ L , m i d ] [L,mid] [L,mid] 的最大权值。相对应的,令 g 0 R g0_R g0R 表示以 R R R 结束不取 m i d + 1 mid + 1 mid+1 时 [ m i d + 1 , R ] [mid + 1,R] [mid+1,R] 的最大权值, g 1 R g1_R g1R 表示以 R R R 结束取 m i d + 1 mid + 1 mid+1 时 [ m i d + 1 , R ] [mid + 1,R] [mid+1,R] 的最大权值。
对于所有
L
L
L 和
R
R
R,我们可以用类似 dp 的方法预处理出
f
0
L
,
f
1
L
,
g
0
R
,
g
1
R
f0_L,f1_L,g0_R,g1_R
f0L,f1L,g0R,g1R,此时当前区间产生对答案的贡献即为
∑
l
≤
L
≤
m
i
d
∑
m
i
d
+
1
≤
R
≤
r
max
(
f
0
L
+
g
1
R
,
f
1
L
+
g
0
R
)
\sum_{l\le L\le mid}\sum_{mid+1\le R\le r}\max(f0_L+g1_R,f1_L+g0_R)
l≤L≤mid∑mid+1≤R≤r∑max(f0L+g1R,f1L+g0R)
。考虑
f
0
L
+
g
1
R
≥
f
1
L
+
g
0
R
f0_L+g1_R\ge f1_L+g0_R
f0L+g1R≥f1L+g0R 的情况,移项得
f
0
L
−
f
1
L
≥
g
0
R
−
g
1
R
f0_L-f1_L\ge g0_R-g1_R
f0L−f1L≥g0R−g1R。于是我们可以将
L
L
L 按
f
0
L
−
f
1
L
f0_L - f1_L
f0L−f1L 排序,
R
R
R 按
g
0
R
−
g
1
R
g0_R-g1_R
g0R−g1R 排序,使用双指针计算对应贡献。
另一种情况是对称的,处理方法相似。
时间复杂度 O ( n log 2 n ) O(n\log^2n) O(nlog2n)。