NOI Online 提高组 Day1
A 序列
给出长度为的序列和,有个操作方式,表示为三元组形如:
- 若,则可以使和同时加 1 或减 1(如果,相当于把加 2 或减 2);
- 若,则可以使和一个加 1,一个减 1。
你可以使用每种方法无数次。问能否把变成(yes or no)。
。
摘要:挖掘性质,缩点,判二分图。
设点权,则我们的目标变成:让每个点点权变成。
操作 2 可以改变点权,但点权和不变。
把操作当作连边。我们考虑操作 2 的边构成的连通块。那么我们在这个连通块上进行操作的时候,点权和是始终不变的。
因此我们把操作 2 的连通块缩点。剩下的就只有操作 1 的边。
由于两个操作 1 可以构成一个操作 2,因此对于新的图上,考虑操作 1 的边构成的连通块:
- 如果是一个二分图,那么左部(右部)在点权和不变的情况下可以任意变换点权。因此要让左部和右部的点权都变成,等价于,左部和右部的点权和变成。由于操作 1 只能同加同减,因此等价于,坐标和右部点权和相等。
- 如果不是二分图,那么我们可以把这个连通块点权和加 2 或者减 2。因此要把点权都变成,等价于把点权和变成,等价于,点权是的倍数。
综上,缩点后 DFS 即可。时间复杂度或者。
B 冒泡排序
对进行一次冒泡排序的伪代码为
给出一个排列,有次操作:
- 交换和;
- 询问当前排列经过次冒泡排序后的逆序对数。
。
摘要:挖掘性质,树状数组。
首先要发现冒泡排序的性质。
我们称二元组满足是关于的逆序对,记其集合为。
性质 1:进行一次冒泡排序,则,与有关的逆序对数最多减少个。
性质 2:进行一次冒泡排序,若存在使得,与有关的逆序对数一定减少个。
推论:进行次冒泡排序,对于任意,关于的逆序对会减少个。
因此我们维护。则一次交换操作最多影响两个数的。对于询问,我们要求的就是
使用几个树状数组维护即可。
时间复杂度。
C 最小环
给定⻓度为的序列,我们将该序列视为⼀个⾸尾相邻的环,更具体地,对于下标为的两个数,它们的距离为。
现在再给定个整数,对每个,你需要将上⾯的序列重新排列,使得环上任意两个距离为的数字的乘积之和最⼤(二元环的乘积之和要算成)。求出最大的乘积之和。
。
摘要:结论题。
考虑四个数,交换,则代价的变化是。
因此我们得到,当时是最优的。
于是我们的最优方案一定满足,对于环上任意四个相邻的数,。
考虑的情况。全排列打表发现:
- 对于长度为的序列,且满足,则最优方案(环)是。
- 对于长度为的序列且,最优方案是。
另一方面,对于一次询问,我们把距离为的点连边(这是真的环),则会构成个真环,环长。易证(可以通过交换证明,或者打表发现),用序列构造第一个真环,构造第二个真环,构造第个真环,这样的总和的最大的。真环的构造方法就是的情况。
那么对于的每个约数计算时的答案即可。
时间复杂度。
修订记录
- 2020年3月7日 创建文章