HNOI2019 題解


題目排序不是我做題的順序也不是試題順序。

多邊形

首先要知道終止態是所有邊都指向了 \(n\) 號節點。
那么我們如果每一步都讓 \(n\) 的度數 +1 那一定是最優的,顯然可以辦到。
那么可以從與 \(n\) 相鄰的邊分割出若干個獨立的部分求解。
對於一個部分,每次我們一定是選一個最高的邊進行 \(\text{rotate}\),然后分成兩個獨立的部分。

對於一個 \(\text{rotate}(a,c)\),二分找到 \(\lt c\) 的最大的與 \(a\) 有邊的就是 \(b\)

注意到這個形成一個二叉樹結構。
根據森林的拓撲序計數 \(res={n!\over \prod size_i}\) 答案只跟樹上節點的 \(size_i\) 有關,可以直接計算。
考慮 \(\text{rotate}\) 一次的影響,根據下圖:
1RgBsf.png
只有 \(x\) 這個點的 \(size\) 變化,更新一下即可。
時間復雜度 \(O(n\log n)\) 或者 \(O(n)\)

白兔之舞

首先知道兩個數組循環卷積相當於 DFT 以后點值相乘再 IDFT 回去。

\[c_i=\sum_{j=0}^{n-1}\sum_{k=0}^{n-1} a_jb_k[j+k=i\mod n]\\ ={1\over n}\sum_{j=0}^{n-1}\sum_{k=0}^{n-1} a_jb_k\sum_{d=0}^{n-1}w^{d(j+k-i)}\\ ={1\over n}\sum_{d=0}^{n-1}w^{-di}A(w^d)B(w^d) \]

考慮算一個數組的 DFT

\[f_i=A(w^i)=\sum_{j=0}^{n-1}a_jw^{ij}\\ =\sum_{j=0}^{n-1}a_jw^{{i+j\choose 2}-{i\choose 2}-{j\choose 2}} \]

mtt 即可。
考慮算一個數組的 IDFT,reverse 處理即可。

魚身和魚尾是兩個獨立的部分,分開做並且預處理出來。

考慮對於 \(AD\) 統計 \(BC\), 可以先枚舉所有 \(BC\) 把它掛在 \(BC\) 的垂直平分線上,然后在線段 \(AD\) 處在直線 \(AD\) 所對應的 \(\text{vector}\) 里面二分這個區間。
垂直平分線的條件是充要的,為了方便用斜截式 \(y=kx+b\) 來表示直線,二元組 \((k,b)\) 均為化簡的分數(此題嚴重卡精度、卡 int64 溢出)。
對於 \(y_p \neq y_q\) 的點對,垂直平分線斜率存在,把中點橫坐標插入 vector 中;
對於 \(y_p = y_q\) 的點對,垂直平分線斜率不存在,用唯一確定的橫坐標 \(x_p+x_q\over 2\) 表示這一類直線,把中點縱坐標插入 vector 中。

考慮對於 \(AD\) 統計 \(EF\),考慮先枚舉 \(D\) 再枚舉 \(A\) 的話,然后所有點關於 \(D\) 點極角排序,\(\angle ADQ \in (0.5\pi, 1.5\pi)\)\(Q\) 可以作為 \(E/F\) 點。
雙指針掃描,類似莫隊一樣維護以 \(dist(D,Q)\) 為下標的 map 即可算出點對個數。

話說這個要取中點於是一開始坐標統一 \(\times 2\),然后極限的 \(dist=(4\times 10^9)^2+(4\times 10^9)^2\) 爆了 unsigned long long。。。

枚舉 \(A\)\(D\)\(BC\) 方案跟 \(EF\) 方案乘起來即可,因為有序的,最后還要乘 \(4\)
時間復雜度 \(O(n^2\log n)\)

序列

直接二次函數可以證明一個連續段如果用同一個 \(b_k\) 那一定是取平均數。
\(50pts\) 做法看了就會了而且是我校 tgz 模擬賽。
考慮單調棧彈棧的過程,對於一個前綴,已經插進去的左端點過會還可能沒了,但已經沒了的左端點再也不會出現。
后綴也是同理,考慮一個 \(i\) 維護 \(i-1\) 的前綴單調棧和 \(i+1\) 的后綴單調棧,最終答案一定是取若干個完整的前綴棧棧頂 + \(i\) + 若干個完整的后綴棧棧頂拼接成中間一個連續段,然后兩個棧內剩下來的不動,作為最終的答案序列。

定義 \(push\) 操作為把 \(i\) 或者 \([l,r]\) 插入到前綴棧中,然后調整到這個棧單調的操作。

一個暴力做法是我們 \(push(i)\),然后判斷左邊棧頂是不是 \(\le\) 右邊棧頂,否則我們嘗試把右棧棧頂整個區間 \(push\) 了,彈掉,當第一次滿足條件的時候停止,大致如下圖。這個做法是對的,因為這個是單調的,往右做一次的話左棧頂應該減小了而右棧頂變大了。
1R5Ffg.png

直接按上面那么做,復雜度 \(O(n^2)\),實際得 \(100\) 分。
因為有單調性我們可以二分這個右端點(只能是棧中元素的右端點),把這段區間一起 \(push\) 了,找最靠左的 \(mid\) 即可。
復雜度 \(O(n\log^2n)\) 實際得 \(100\) 分。
還有那個后綴棧的問題,我們可以先從 \(n\)\(1\) 做出來這個棧,然后再逐位撤銷操作。(詢問離線下來)
可持久化線段樹也可以。

校園旅行

首先 \(30pts\) 的暴力 bfs 必須會,就是往隊列里面插入單個點以及相鄰的同色點,每次向兩頭擴展相同的顏色,更新答案。
時間復雜度 \(O(m^2)\)

\(\sum_{u,v} \text{degree}_u\times \text{degree}_v = O(m^2)\)

考慮縮圖,定義0->0為黑邊,1->1為白邊,0->1/1->0為橋邊。
那么一條回文路徑可以表示為
黑邊<-橋邊<-白邊<- ... o ... ->白邊->橋邊->黑邊

現在約定:走黑白邊必須一次性走 1e9 / 1e9 + 1 條,橋邊必須一次性走 1e9 + 1 條。
那么與原問題等價。

考慮一個黑連通塊,若 u->v 只能走出一種奇偶性,那么僅保留一條路徑也無妨。
否則我們還要保證 u->v 能走出兩種奇偶性。

對於第一種情況,縮出一棵樹即可;第二種我們造一個自環。

考慮橋邊,環是沒有意義的,黑色 \(P\) 點可以到達白色 \(Q\) 點則一定能走出長度為 1e9 + 1 的路徑。
直接刪去這樣的環邊即可。

JOJO

這個題太難了,寫了一天,要寫的內容好多,先鴿了。


免責聲明!

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



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