专栏文章

题解:P13364 [GCJ 2011 Qualification] GoroSort

P13364题解参与者 8已保存评论 8

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
8 条
当前快照
1 份
快照标识符
@minikg2j
此快照首次捕获于
2025/12/02 03:00
3 个月前
此快照最后确认于
2025/12/02 03:00
3 个月前
查看原文

题解

不妨假设策略最终排好序次数的期望存在,否则没有讨论的意义。
对于任何策略,考虑它一次对于一个排列的操作对不动点个数带来的影响。假定选取了 mm 个位置,其中 pp 个原本就是不动点,qq 个在排列后(这个位置)可能是不动点。根据期望的线性性,期望增加的不动点个数是 q/mp1q/m-p\le 1。且若每次选取所有未归位的点,这个数恰好是 11
直觉上每次减少不超过 11 那么一定至少要这么多次才能归位,可以用鞅来严谨化这一点。
考虑令 ckc_k 为表示 kk 步之后未归位的点个数,则根据上文可以验证 dk=ck+kd_k=c_k+k 是一个下鞅。定义停时 TT 为第一次 ck=0c_k=0 的时候。(也就是排好序的时候)根据假设,E[T]\mathbb E[T] 存在。并且,因为 0ckn0\le c_k\le n,有 dkdk+1n+1|d_k-d_{k+1}|\le n+1 恒成立。因此停时定理的条件成立!可以利用下鞅的停时定理得到 E[dT]E[d0]\mathbb E[d_T]\ge \mathbb E[d_0],化简可得 E[T]c0\mathbb E[T]\ge c_0,而 c0c_0 表示初始未归位的点的个数。特别的,在策略“每次选取所有未归位的点”中,这个下鞅是一个鞅,等式取等。因此答案为 c0c_0

代码

PYTHON
for _ in range(int(input())):
    n=int(input())
    a=list(map(int,input().split()))
    print('Case #%d: %d'%(_+1,sum(a[i]!=i+1 for i in range(n))))

评论

8 条评论,欢迎与作者交流。

正在加载评论...