题目大意
定义\(b_i为\)一个排列\(a\)中前\(i\)个数的最大值。 定义操作:把排列\(a\)向后移动一位,即,原本最后一个数成为第一个数,原本第一个数成为第二个... 定义\(c_i\)为向后移动\(i-1\)位后,每次生成的\(b_i\)数组中,不同的数的个数。
现在给定\(c\)数组,判断是否存在对应的排列\(a\) 原题链接 ## 思路 假设已经移动了\(k\)次,每次移动后,最后一个数会到第一个,其它数的顺序不变。也就是说: * 如果\(a_n < a_1\),那么\(c[k + 1] = c[k] + 1\)。 * 如果\(a_n > a_i\),那么\(c[k + 1] < c[k]\)
也就是说,我们只需要判断\(c\)数组中是否存在\(c[k] > c[k - 1] + 1\)即可。
但是需要注意的是,我们任意向右移动\(c\)数组,也应该存在相应的\(a\)数组,即\(c[1] - c[n] <= 1\),我们需要特判一下这个条件。
一种直接做法是,我们不妨直接通过向右移动,把\(1\)转到第一位,这样显然\(c[1] - c[n] < 1\)
代码
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2022/03/31/cf1658C/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!