[BZOJ 2171]K凹凸序列

本文介绍了如何解决K凹凸序列的问题,包括理解ZigZag子序列和K凹凸序列的概念。针对不同K值提供了不同的解法,如K=1时将所有数调整到中位数,K=2时保持单调,K=3时通过枚举转折点和使用左偏树计算成本。对于K=4,通过预处理和O(n^2k)的DP求解。文章还提到了代码实现过程中需要注意的难点和陷阱。
摘要由CSDN通过智能技术生成

一、题目

题目描述

一个序列的第1,3,5…项被称作奇数项,第2,4,6…项被称作偶数项。一个序列A[1…n]被称作ZigZag序列当且仅当以下两个条件中的一个(或两个)成立: 1)除了首项,所有的奇数项都比它的前项小且所有的偶数项都比它的前项大。 2)除了首项,所有的奇数项都比它的前项大且所有的偶数项都比它的前项小。一个序列A[1…n]被称作K凹凸序列当且仅当它的最长ZigZag子序列(不一定是连续子序列)的长度不超过K。现在有一个序列A[1…n],每次可以花费1的代价使得A中的某一项增加或减少1。我们的目的是花费最少的代价让它成为K凹凸序列。输入的第一行包含两个正整数,分别表示数列A[1…N]的长度N和K。接下来的N行每行一个自然整数,依次表示数列的项。

数据范围

前1个测试点满足:K=1,N≤20000
第2~8个测试点满足:K=2,N≤20000
第9~15个测试点满足:K=3,N≤20000
第16~20个测试点满足:K≤10,N≤1000
所有测试点满足:A[i]≤50000

二、解法

首先需要理解这种子序列就是一大一小(也就是凹凸的),观察数据范围,不难发现本题需要数据分治。

k = 1 k=1 k=1,最简单的一种情况,把所有数都变成中位数。

k = 2 k=2 k=2,整个序列必须是单调不减 / / /单调不增的,就变成了这道题

k = 3 k=3 k=3,一定有一个转折点,使得前面单调不减,后面单调不增 / / /前面单调不增,后面单调不减,那么我们就枚举转折点,可以用 k = 2 k=2 k=2的方法预处理改变的花费,但由于我们要知道每个位置的花费,我们维护每个区间的和 s s s,在左偏树上的和 h s hs hs,还记录上一次合并的花费,由绝对值的几何意义知道这个区间新的花费是 s − 2 h s s-2hs s2hs,然后还要特殊考虑区间长度为奇数的情况,要出去中位数的影响(再加上一个中位数),这一部分可以结合代码理解。

k = 4 k=4 k=4,发现此时 n ≤ 1000 n\le1000 n1000,用 k = 3 k=3 k=3的方法预处理把每个区间变成单调不增 / / /单调不减的花费,然后就有一个很显然的 d p dp dp了,最后要求出把原序列划分成 k − 1 k-1 k1个单调段的最小花费, O ( n 2 k ) O(n^2k) O(n2k)暴力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值