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了

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