1. 程式人生 > >[JZOJ 5910] [NOIP2018模擬10.18] DuLiu 解題報告 (並查集+思維)

[JZOJ 5910] [NOIP2018模擬10.18] DuLiu 解題報告 (並查集+思維)

題目連結:

https://jzoj.net/senior/#contest/show/2530/0

題目:

   LF是毒瘤出題人中AK IOI2019,不屑於參加NOI的唯一的人。他對人說話,總是滿口垃圾題目者也,教人半懂不懂的。因為他姓李,別人便從QQ群上的“毒瘤李Fee”這半懂不懂的話裡,替他取下一個綽號,叫做李Fee。
        李Fee一到機房,所有做題的人便都看著他笑,有的叫道,“李Fee,你又來出毒瘤題了!”他不回答,對驗題人說,“我又出了兩道題,給我驗驗。”便排出一排毒瘤題。大家又故意的高聲嚷道,“你又暴露奸商本性拿毒瘤題騙錢剝削驗題人了!”李Fee睜大眼睛說,“你怎麼這樣憑空汙人清白……”“什麼清白?我前天親眼見你出了道毒瘤騙錢題,被PTY把std吊著打。” 李Fee便漲紅了臉,額上的青筋條條綻出,爭辯道,“出題人的題不能算騙……毒瘤!……出題人的題,能算毒瘤騙錢題麼?”接連便是難懂的話,什麼“多叉splay隨機點分治”,什麼“樹鏈剖分套分治FFT”之類,引得眾人都鬨笑起來:機房內外充滿了快活的空氣。


雖然他的題十分毒瘤,但他的題還總是有買家。李Fee現在有N道毒瘤題,想將這些題出成一組題來騙大錢。然而顯而易見的是,一組題的毒瘤程度不僅和每道題的毒瘤程度有關,也跟它們的排列順序有關,李Fee需要將它們排列成最毒瘤但又最能騙錢的那個順序。
       具體來說,這N道題每題都有一個毒瘤值,它們構成了一個序列。李Fee心目中有一個理想的毒瘤值序列,這個序列並不一定每一題的毒瘤值都是原本N道題中出現的,所以李Fee準備進行一些改動。這些改動體現在毒瘤值上就是將某道題的毒瘤值改為所有題的毒瘤值的二進位制異或值。但是,改動題目是很麻煩的,他想算出最少需要多少次改動才能將原本的毒瘤值序列改成理想的毒瘤值序列,李Fee忙於出毒瘤題,他想請發明O(1/n)演算法用暴力搜過所有毒瘤題的你幫他算出答案。但是他是個奸商,所以他並不打算給你報酬。

題解:

操作的本質其實就是一開始手裡拿著a的異或和,每次選一個數和它換一下,不斷這樣下去

為了方便,我們把a的異或和和b的異或和分別放到隊尾,排序一下判斷這兩個數列是否完全一樣,如果不一樣顯然不存在一種方案,輸出-1即可

把a,b離散化,a[i]和b[i]連邊(包括a[n+1],b[n+1]),稍加分析會發現一次次的替換會形成環,最終會有很多個環。注意連邊的時候我們以值域為點,這個值域出現的次數為點權,顯然處理一個環的代價為這個環的點權之和。從一個環到另一個環的代價為1。

由於我們一開始拿著的是a的異或和,考慮a的異或和是否在環裡,如果不在我們還需要花1的代價進入一個環(不在的情況並且僅當a[n+1]==b[n+1],和a陣列之前有沒有出現a[n+1]沒有關係)

本質:對於一個環我們每次都可以花費1的代價讓一個位置變的正確,處理完一個環我們就處理下一個