本文将同步发布于:
题目
题目链接:gym102331H。
题意概述
给定一个长度为 n n n 的序列 a a a,有 q q q 次询问,每次询问给定三个参数 l , r , k l,r,k l,r,k,求出对于区间 [ l , r ] [l,r] [l,r],你将其划分为若干个子区间,然后取其中的 k k k 个,最大化取出来的所有元素的和。即:最大 k k k 子段和。
1 ≤ n , q ≤ 3.5 × 1 0 4 1\leq n,q\leq 3.5\times 10^4 1≤n,q≤3.5×104, ∣ a i ∣ ≤ 3.5 × 1 0 4 |a_i|\leq 3.5\times 10^4 ∣ai∣≤3.5×104。
题解
寻找函数的性质
如果我们设 f [ l , r ] ( k ) f_{[l,r]}(k) f[l,r](k) 表示区间 l , r l,r l,r 的最大 k k k 子段和,那么我们不难猜测到 l , r l,r l,r 相同时, f ( k ) f(k) f(k) 是一个上凸函数。
我们考虑证明这一点,即 f ( k ) − f ( k − 1 ) ≥ f ( k + 1 ) − f ( k ) f(k)-f(k-1)\geq f(k+1)-f(k) f(k)−f(k−1)≥f(k+1)−f(k)。
考虑反证法,设 ∃ x ∈ N \exists x\in\mathbb{N} ∃x∈N,满足 f ( x ) − f ( x − 1 ) < f ( x + 1 ) − f ( x ) f(x)-f(x-1)<f(x+1)-f(x) f(x)−f(x−1)<f(x+1)−f(x)。
那么我们考虑在 x − 1 , x , x + 1 x-1,x,x+1 x−1,x,x+1 的时候的选取方案。
- 若取 x + 1 x+1 x+1 的时候正子段仍未取完,那么 f ( x ) f(x) f(x) 比 f ( x − 1 ) f(x-1) f(x−1) 多取了一个区间 p ( p > 0 ) p(p>0) p(p>0); f ( x + 1 ) f(x+1) f(x+1) 比 f ( x ) f(x) f(x) 多取了一个区间 q ( q > 0 ) q(q>0) q(q>0)。
如果我们认为 f ( x ) − f ( x − 1 ) < f ( x + 1 ) − f ( x ) f(x)-f(x-1)<f(x+1)-f(x) f(x