《基礎排序算法練習題》


例1:排序只能交換相鄰數字,最少交換次數為逆序對數。
證:每次交換能使逆序對數不變或-1,且排序完成與逆序對數=0等價。此外,只要存在逆序對就會存在相鄰逆序對,交換相鄰逆序對使逆序對數剛好-1。
例2:區間順逆排序,詢問位置的值。
做法:二分答案,取01“暴力”,時間O((n+mlogn)logn),空間O(n+m)。
例3:比較網絡(規模為n的輸入及輸出的黑箱,內部只有比較置換器)是否為排序網絡,有多少個序列能夠成功排序。
做法:所有的01序列,是否都能夠成功排序,如果都可以就可以,因為當且僅當所有數k排序后<k的數都在k之前才行。計數則可以思考漸變的01序列,必須每一個都合法,像middle那樣,就是路徑計數O(n2^n)了。

 

題意:對於一個長為n的數組,定義一個m個步驟的算法,第i步將a[li~ri]升序排序。共詢問q次,每次給出一個這樣的數組,詢問算法能否將數組成功排序。
20%:n≤100,200 m≤100,200 q≤100,200
  直接暴力,時間O(qmnlogn),空間O(m+n)。
20%:n≤1400,1500 m≤9e5,1e6 q≤8
  用set保存相鄰逆序對。m次操作每次維護相鄰逆序對的變化,區間排序后逆序對不會增多,逆序對最多O(n^2)個,時間O(q(n^2+m)logn),空間O(n^2+m)。注意到這種做法也可以用來模擬例1的過程!
10%:n≤1300 m≤8e5 q≤1300 序列為01序列且1的個數一定
  最終排序成功的結果是唯一的,從結果逆推(將區間隨便shuffle)就可以得到所有的最初輸入但規模是指數級的。稍作證明,可以發現解的優劣以及每一步的最劣結果是存在的(這里的推理很強!!!)。預處理找到最劣解,使用例2的線段樹是O(n+mlogn)的,后續的check是O(n)的。
20%:n≤1400,1500 m≤4000,5000 q≤1400,1500
30%:n≤1200,1400,1500 m≤7e5,9e5,1e6 q≤1200,1400,1500
  技巧:將序列離散化為排列,相同的數則下標較小的取較小的值,逆序對的情況不變所以是正確的。
  考慮排序網絡,相當於其n-1個(≥2~n)01序列都可以成功。
  於是需要預處理出1出現各種次數的worst解,直接暴力復雜度無法接受,於是可以考慮整合,直接對1~n的序列求worst解然后依次化成01序列是完全等價的。檢查的時候依次檢查,如果變成一個+1一個-1若前綴和為正為負則不可行。預處理使用消逆序對O((n^2+m)logn),暴力預處理O(mnlogn),使用段數合並拆分結構也可以但金策不會證復雜度。每次check復雜度O(nlogn)。

暴力優化:去掉完全無效的操作,使用n~1的排列模擬,如果無用則刪去。


造操作:

20%朴素模擬可過隨機構造平均化AC與WA;

20%的q較小但q太小也不行逆序對,且要讓操作的區間足夠長且不存在無用操作而且不能過早結束排序(留下邊上幾個元素最后才操作);

20%的m和n小可以用暴力預處理,構造可以遞歸構造O(n)個操作O(n)長度的區間O(n^2)的逆序對,卡掉錯誤做法;

10%+30%中有兩種,第一種為第二個20%,第二種幾乎只修改相鄰元素O(n^2)個有效狀態暴力即O(qn^2)。

造詢問數組:

造完操作后,處理出worst解,然后隨機調整。

生成AC的就交換較近逆序對;生成WA的就生成較近逆序對。

WA的結果和AC很相似,防止隨機水過,再摻雜一些極端糟糕的數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM