或许可以看作是一类可以迁移运用的构造(?)题套路?
核心思想就是多次加强 / 削弱 / 扩展题目中给出的操作,得到性质更好 / 更容易利用 / 更简洁的新操作,通过新操作解决整个问题。
Example 1
给定一个长度为 的整数数组 和一个包含 个正整数的集合 ,其中 。
你可以对 进行如下操作:选择某个 ,其中 必须出现在 中。然后在集合 中选择从数组 中选择一个长度为 的区间,将该区间内的每个元素都乘以 。
问执行若干次上面给出的操作后,数组 所有元素之和 的最大值。
Data Range:
Solution 1
题目给了 个不同长度的区间取反操作,考虑使用原有的这些操作构造出更通用而且性质更优美的新操作。注意到记 ,则必然存在一组整数 满足 ,因此可以构造出这样的一个操作:每次取反序列中连续的 个数。记这个操作为操作 。
发现这个操作仍然没有太好的性质,因此考虑继续构造新操作:注意到若第一次操作反转了区间 内的数,第二次操作反转了区间 内的数,则两次操作结束后只有位置 的数被反转。因此又可以构造出一个新的操作:每次在序列中选择两个距离恰好为 的数,并将这两个数反转。记这个操作为操作 。
但是构造出的操作 不和操作 一样和原有操作形成充要条件,这个新构造出的操作过于强,也就是说该操作的必要性是不成立的,这里我们先假装操作 同样形成了充要条件解决该问题:注意到若将序列按照下标 的结果分为 个不同的序列,则不同序列之间互相独立。对于单个序列而言可以看作是每次将相邻两个位置的值取反,执行若干次操作后让单个序列内所有元素的和最大。考虑寻找执行操作后得到的不变量,注意到此时不论怎么对序列执行操作,在不考虑 的情况下,序列中负数数量的奇偶性不会发生变化。
对单个序列而言这个操作的性质还是不够强,因此考虑对于单个独立序列的两个不同位置 (),依次对 ,,, 这些位置分别执行操作,则最终只有 两个位置的符号会发生变化。因此又构造出了新的操作 :对一个新的序列而言,每次可以任意选择两个不同的位置,并将两个位置的值都取反。容易证明操作 和操作 互为充要条件。
此时记该序列负数数量为 ,则:
- 若 ,则显然可以将所有负数都通过操作 取反,该序列的答案就是所有元素的绝对值的和。
- 若 ,则此时必须要留一个负数或者 ,找到绝对值最小的数,让其变为负值,其余数均变为正值即可。
但是此时仍然没有处理操作 不和操作 互为充要条件的问题。注意到此时唯一的问题是每个独立序列之间负数奇偶性的关系不能被破坏(相对关系不变),因此记录某个序列操作奇数次 / 偶数次后,所有元素的和最大是多少,然后分两类统计答案取最大值即可。
该算法处理单组数据的时间复杂度为 ,可以通过该题。
Example 2
题解。
Example 3
题解。
喜欢的话,留下你的评论吧~