P7482 不条理狂诗曲 题解【纯思路】

阅读须知

本文章仅提供解题思路!

题意

给定长度为 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=1nr=lnf(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 取模。

思路

求所有区间的权值和提示我们使用分治。

考虑分治。设当前处理的区间为 [ 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) lLmidmid+1Rrmax(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+g1Rf1L+g0R 的情况,移项得 f 0 L − f 1 L ≥ g 0 R − g 1 R f0_L-f1_L\ge g0_R-g1_R f0Lf1Lg0Rg1R。于是我们可以将 L L L f 0 L − f 1 L f0_L - f1_L f0Lf1L 排序, R R R g 0 R − g 1 R g0_R-g1_R g0Rg1R 排序,使用双指针计算对应贡献。

另一种情况是对称的,处理方法相似。

时间复杂度 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值