题意
小w
有一个长度为 nnn 的环形数列,即 aia_iai 与 ai+1a_{i+1}ai+1 相邻, ana_nan 与 a1a_1a1 相邻。因此,每个数字都有且仅有两个邻居。
小w
每分钟可以执行两种操作。
MIN
操作,将 aia_iai 设置为它和它的两个邻居的值的最小值。MAX
操作,将 aia_iai 设置为它和它的两个邻居的值的最大值。
比如对于序列 3,5,23,5,23,5,2 ,对数字 555 作MAX
操作可以得到数列 3,5,23,5,23,5,2 ,作MIN
操作可以得到数列 3,2,23,2,23,2,2 。
小w
想知道对于 111 到 mmm 的每个数字 xxx ,将环形数列 aaa 通过MIN
操作和MAX
操作变换到 xxx 的最少操作次数。
对于 10%10 \%10% 的数据, n≤5,m≤5n \le 5,m \le 5n≤5,m≤5。
对于 50%50 \%50% 的数据, n≤1000,m≤1000n \le 1000,m \le 1000n≤1000,m≤1000。
对于 100%100 \%100% 的数据, 3≤n≤200000,1≤m≤2000003 \le n \le 200000, 1 \le m \le 2000003≤n≤200000,1≤m≤200000。
题解
容易想到贪心:对于一个数x,每两个x之间的数按照小于或大于它分为若干段,代价就是数的个数+段数。但如果有一段只有一个数,那么可先将它改小,这样可使答案-1。于是对于一些连续的只有一个数的段,它可使答案减少个数/2。
而直接用线段树维护是不好做的(考场+考后调到自闭)。此时应注意到每个数的状态只有0/1,而答案与每个数和前一个数的异或值有关。于是联想到异或差分:一段区间的答案即为这段区间的差分数组的连续1的段的长度/2之和。于是容易维护。