A 序列

给出长度为的序列,有个操作方式,表示为三元组形如

  1. ,则可以使同时加 1 或减 1(如果,相当于把加 2 或减 2);
  2. ,则可以使一个加 1,一个减 1。

你可以使用每种方法无数次。问能否把变成(yes or no)。

摘要:挖掘性质,缩点,判二分图。

设点权,则我们的目标变成:让每个点点权变成

操作 2 可以改变点权,但点权和不变。

把操作当作连边。我们考虑操作 2 的边构成的连通块。那么我们在这个连通块上进行操作的时候,点权和是始终不变的。

因此我们把操作 2 的连通块缩点。剩下的就只有操作 1 的边。

由于两个操作 1 可以构成一个操作 2,因此对于新的图上,考虑操作 1 的边构成的连通块:

  1. 如果是一个二分图,那么左部(右部)在点权和不变的情况下可以任意变换点权。因此要让左部和右部的点权都变成,等价于,左部和右部的点权和变成。由于操作 1 只能同加同减,因此等价于,坐标和右部点权和相等。
  2. 如果不是二分图,那么我们可以把这个连通块点权和加 2 或者减 2。因此要把点权都变成,等价于把点权和变成,等价于,点权是的倍数。

综上,缩点后 DFS 即可。时间复杂度或者

代码

B 冒泡排序

进行一次冒泡排序的伪代码为

给出一个排列,有次操作:

  1. 交换
  2. 询问当前排列经过次冒泡排序后的逆序对数。

摘要:挖掘性质,树状数组。

首先要发现冒泡排序的性质。

我们称二元组满足是关于的逆序对,记其集合为

性质 1:进行一次冒泡排序,则,与有关的逆序对数最多减少个。

性质 2:进行一次冒泡排序,若存在使得,与有关的逆序对数一定减少个。

推论:进行次冒泡排序,对于任意,关于的逆序对会减少个。

因此我们维护。则一次交换操作最多影响两个数的。对于询问,我们要求的就是

使用几个树状数组维护即可。

时间复杂度

代码

C 最小环

给定⻓度为的序列,我们将该序列视为⼀个⾸尾相邻的环,更具体地,对于下标为的两个数,它们的距离为

现在再给定个整数,对每个,你需要将上⾯的序列重新排列,使得环上任意两个距离为的数字的乘积之和最⼤(二元环的乘积之和要算成)。求出最大的乘积之和。

摘要:结论题。

考虑四个数,交换,则代价的变化是

因此我们得到,当是最优的。

于是我们的最优方案一定满足,对于环上任意四个相邻的数

考虑的情况。全排列打表发现:

  1. 对于长度为的序列,且满足,则最优方案(环)是
  2. 对于长度为的序列且,最优方案是

另一方面,对于一次询问,我们把距离为的点连边(这是真的环),则会构成个真环,环长。易证(可以通过交换证明,或者打表发现),用序列构造第一个真环,构造第二个真环,构造第个真环,这样的总和的最大的。真环的构造方法就是的情况。

那么对于的每个约数计算时的答案即可。

时间复杂度

代码