先根据排序方案确定最终顺序。下文称第 \(i\) 个人为最终排名为 \(i\) 的那个人,其原始编号为 \(id_i\),总成绩为 \(v_i\)。
若第 \(i\) 个人公布了 \(c_i\) 道题,公布部分成绩为 \(s_i\),则可能成绩区间为 \([s_i, s_i + k(m - c_i)]\),有 \(s_i + k(m-c_i) + [id_i < id_{i-1}] \le s_{i-1}\)。
考虑 DP,设 \(f(i, s)\) 表示前 \(i\) 个人,第 \(i\) 个人公布部分成绩 \(\ge s\),的最小公布部分总数。先考虑等于 \(s\),枚举 \((c, s)\):
\[f(i, s) = \min_{(c, s)} f(i - 1, s + k(m - c) + [id_i < id_{i-1}]) + c
\]
然后取一轮后缀 \(\min\) 即可得到真实的 \(f(i, s)\)。
可以通过暴力 DP 找出第 \(i\) 个人合法的 \((c, s)\)。\(O(m)\) 阶段,\(O(m)\) 枚举 \(c\),\(O(mk)\) 枚举 \(s\),这部分复杂度 \(O(nm^3k)\)。
事实上,因为 \(s \le v_i\),只有 \(s \in [v_{i+1}, v_i]\) 的可能是合法的,令 \(l_i = v_i - v_{i+1} + 1\),至多只有 \(ml_i\) 种 \((c, s)\),且 \(\sum l_i = n + mk\)。
为保证复杂度,通过从全部公布倒着 DP 未公布的部分找 \((c, s)\),单轮 \(O(m^2l_i)\),把 \(c\) 用 __int128
压一下可以消掉一个 \(m\)。
总时间复杂度:\(O(nm + m^2k)\)。