1. 程式人生 > 實用技巧 >Codeforces Global Round 9 題解

Codeforces Global Round 9 題解

一場比賽全是構造題就nm離譜

A Sign Flipping

容易發現直接考慮正負交錯就構造完了。

code

B Neighbor Grid

加到最簡單的情況也就是:

2 3 3 2 
3 4 4 3 
2 3 3 2 

這種,如果方格中某個數比這種情況的數大就無解。

code

C Element Extermination

有解當且僅當\(a_1<a_n\)

如果不滿足,\(a_1\)只能遞增,\(a_n\)只能遞減,他們之間的大小關係還是不變,肯定消不掉。
如果滿足,他們之間一定存在可以刪掉的數,沿著這個數一次刪除即可。

code

D Replace by MEX

考慮構造形如\(0,1,2,3...n-1\)

的序列。
求出當前數列的\(\text{mex}\),如果\(\text{mex}\in[0,n-1]\),那麼就把該位置填上\(\text{mex}\)
否則\(\text{mex}=n\),找到一個位置它的值不符合我們的要求,然後把該位置填上\(n\)
這樣子的話時間複雜度\(O(n^2)\),操作複雜度\(O(2n)\)

code

E Inversion SwapSort

考慮\(a_n\rightarrow a_1\)構造。
假設原序列是個排列,現在我們要將\(i\)放到\(i\)位置,那麼我們現在就要把和位置\(i\)有關的\(\text{pair}\)全部用完,令\(pos_i\)

表示\(i\)所在位置。
此時\(i+1\sim n\)全部都已經排好了,那麼我們可以將\(pos_{i+1...n}\)依次與位置\(i\)換一遍,發現這樣的話就可以十分簡單地將\(i\)挪到這個位置,而同時我們也保證了前面的數他們大小關係不變,問題就化為一個規模為\(i-1\)的子問題。
不是排列的話我們強行將\(a_i=a_j,i<j\)變為\(a_i<a_j\)即可。

code

F Integer Game

考慮先手如何絕殺:場上三個數成等差數列且最大值上輪被選過,那麼直接加上公差即可。

怎樣構造:首先將一個數加上一個很大的數(例如\(1e11\)),那麼這個數肯定被欽定為最大值,不妨設它是\(a\)

。然後將\(a\)變為\(b,c\)的等差中項,即使得\(2a=b+c\),因為\(a\)已經選過,那麼直接加上\(2a-b-c\)必然奏效,可以記下此時最大值,再用最大值減去\(a\)就可以了。

code

G Tree Modification

將樹黑白染色,發現一個菊花的話只有一個黑點或白點,而一次操作只能減去一個黑點或白點,那麼答案就是染色後黑白點的數量最小值再減一。

code

H Set Merging

\(O(n\sqrt q)\)的分塊寫臉上了,又因為這題限制和值域相關,所以我們考慮值域分塊。

值域分塊後把每個值域內的數\([l,r]\)按照他們在序列中出現的位置排好序,那麼每次詢問在一段值域上就對應著一段區間,這個區間可以二分出來,因為值域不交所以直接合並是可以的。

考慮塊內我們怎麼處理出所有的區間,可以對該值域進行分治,然後再暴力合併該值域內的位置(該過程較為難以描述建議看程式碼理解),一個塊的操作複雜度\(O(B^2)\)

由上述過程可知我們該演算法的操作複雜度為預處理和詢問兩部分也就是\(O(nB+\frac {Qn}B)\),結合資料範圍可知\(B=\sqrt Q\)時最優。

code

G Cubic Lattice

它 鴿 了