DTOJ 4676. 小w的数列

题意

w有一个长度为 n n n 的环形数列,即 a i a_i ai a i + 1 a_{i+1} ai+1 相邻, a n a_n an a 1 a_1 a1 相邻。因此,每个数字都有且仅有两个邻居。

w每分钟可以执行两种操作。

  • MIN操作,将 a i a_i ai 设置为它和它的两个邻居的值的最小值。
  • MAX操作,将 a i a_i ai 设置为它和它的两个邻居的值的最大值。

比如对于序列 3 , 5 , 2 3,5,2 3,5,2 ,对数字 5 5 5MAX操作可以得到数列 3 , 5 , 2 3,5,2 3,5,2 ,作MIN操作可以得到数列 3 , 2 , 2 3,2,2 3,2,2

w想知道对于 1 1 1 m m m 的每个数字 x x x ,将环形数列 a a a 通过MIN操作和MAX操作变换到 x x x 的最少操作次数。

对于 10 % 10 \% 10% 的数据, n ≤ 5 , m ≤ 5 n \le 5,m \le 5 n5,m5
对于 50 % 50 \% 50% 的数据, n ≤ 1000 , m ≤ 1000 n \le 1000,m \le 1000 n1000,m1000
对于 100 % 100 \% 100% 的数据, 3 ≤ n ≤ 200000 , 1 ≤ m ≤ 200000 3 \le n \le 200000, 1 \le m \le 200000 3n200000,1m200000

题解

容易想到贪心:对于一个数x,每两个x之间的数按照小于或大于它分为若干段,代价就是数的个数+段数。但如果有一段只有一个数,那么可先将它改小,这样可使答案-1。于是对于一些连续的只有一个数的段,它可使答案减少个数/2。
而直接用线段树维护是不好做的(考场+考后调到自闭)。此时应注意到每个数的状态只有0/1,而答案与每个数和前一个数的异或值有关。于是联想到异或差分:一段区间的答案即为这段区间的差分数组的连续1的段的长度/2之和。于是容易维护。

你可能感兴趣的:(贪心,#,线段树)