ARC114F Permutation Division

发布时间 2023-06-17 08:52:58作者: kyEEcccccc

题意

给定一个 \(1 \sim N\) 的排列,Alice 把它划分成 \(k\) 段,Bob 把这 \(k\) 段任意排列。Alice 想让字典序最小,Bob 想让字典序最大。请问最后的排列。

数据范围: \(1\le k\le N\le 2 \times 10^5\)

题解

首先 Bob 的排序只取决于每个段第一个数的大小。字典序不会变小,所以考虑最大化最长公共前缀长度。假设公共前缀长度为某个数是合法的,那么需要满足前面的划分是一个下降子序列,并且后面不能有比最后一个段的开头还大的数作为段落开头。那么考虑枚举最后一个段的开头 \(x\),计算一下前面包含序列第一个数的最长下降子序列长度,可以计算出后面至少要划分出 \(t\) 段,于是可以二分出一个位置使得这个位置后面恰好有 \(t\) 个小于 \(x\) 的元素。那么这个位置前面就是最长公共前缀。找到最长公共前缀长度以后,后面刚好有 \(t\) 个元素可以作为开头,按照他们划分段,然后排序即可。