给出
我们先来看一个 set 来维护。
但是我们还有一个
我们考虑一些区间可以合并成一个等价的区间,我们考虑将区间从左往后一个个加入。我们再开一个数组
我们首先可以得到一个结论:在任一时刻对于那些可能与后面合并的区间,其买入时的价格一定是单调递增的。因为如果不是递增的,如下图情况,原来默认的匹配是
我们还需要发现一个性质,那就是如果现在有两个区间
根据这样两个性质,我们可以得到很多个区间。不难发现这些区间是独立的。最后我们取前
具体代码可以戳这里。
cpp
namespace pufanyi {
const int maxn = 4000005;
typedef long long LL;
LL aa[maxn];
LL bb[maxn];
LL sl[maxn];
LL sr[maxn];
int Main() {
int n, k;
read(n), read(k);
for (int i = 1; i <= n; ++i) {
read(aa[i]);
}
int m = 0, tl = 0, tr = 0;
for (int i = 1, j = 1; i <= n; i = j + 1, j = i) {
while (j <= n && aa[j + 1] >= aa[j]) {
++j;
}
while (tl && aa[i] <= sl[tl]) {
bb[++m] = sr[tr--] - sl[tl--];
}
sl[++tl] = aa[i];
while (tr && aa[j] >= sr[tr]) {
bb[++m] = sr[tr--] - sl[tl--];
}
sr[++tr] = aa[j];
}
while (tl) {
bb[++m] = sr[tr--] - sl[tl--];
}
k = min(k, m);
nth_element(bb + 1, bb + k, bb + m + 1, greater<LL>());
LL ans = 0;
for (int i = 1; i <= k; ++i) {
if (bb[i] > 0) {
ans += bb[i];
}
}
writeln(ans);
return 0;
}
}
int main() {
return pufanyi::Main();
}