gym102222I(冒泡排序的性质)

神必结论:设原序列为\(a\),新序列为\(a'\)
冒泡排序\(k\)轮,之后\(a'\)\(i\)项是\(a\)\(\min(i+k,n)\)项里未在\(a'\)的前\(i-1\)项里出现的最小值

换句话说,按顺序确定\(a'\),每次在\(a\)的前\(\min(i+k,n)\)项里找一个还在的最小值并将其移到\(a'[i]\),然后继续往后

证明:🕊

关于应用,例如可以求最少的排序轮数:
设前\(i-1\)个数已经归位,则\(a\)中前\(\min(i+k,n)\)的最小值至少是\(i\),即\(i\)能进去就是最小值
那么问题变成\(\min(i+k,n)\)要覆盖每个数\(i\),算一下\(k=\max(\)\(i\)所在位置\(x\)-\(i\),\(0)\)即可

对于gym102222I:
由于最后的情况只有n种,所以枚举最后的情况,然后用上述结论计数应该就行了
具体来说,枚举排序k轮后的序列a',求a的方案数
由a求a'是把a的前min(i+k,n)项的最小值移到a'[i],反过来就是把a'[i]移到a的前min(i+k,n)项的空位,同时要保证a'[i]是前min(i+k,n)项里a'[i]和在它之后放进去的数的最小值,即放入a'[i]后,a的前min(i+k,n)项之后只能放大于a'[i]的数
最后的序列类似123745689,设"异常"数字7为x,位置为i
则在放完x之后,a[1~min(i+k,n)]都只能放大于x的数
那么显然a'在x后的小于x的一段(上例是456)都不能放进a[1~min(i+k,n)]里,发现只能放到可放段的末尾(每次i+1后多出来的那格,最多1解或无解),直到a'[i']大于x为止

(一般情况是相当于上永久buff,之后都要大于a'[i];本题观察发现只有x的buff有效,并且在a'[i']>x之后就会失效)

这样计数就ok了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章