初賽
打得第 \(3\) 場。link。
省流:\(6\) 題,rk 35,沒過 F,輸麻了。
過題順序是 A->D->B->C->E->G->(F)。
F 沒調完。
簡要 sol:
- A:
過題時間:00:09:08,無罰時。
難度:大概 1500?
二分答案一下,然後沒了。複雜度 \(\Theta(n\log{v})\)。
- B:
過題時間:00:25:28,一發罰時。
罰時原因:陣列開小了。
難度:大概 1600?
容易轉換成 \(n\) 次區間加,然後問你有多少個點最終的值膜 \(4\) 為 \(1\)。
離散化,差分,然後做完了,複雜度 \(\Theta(n\log{n})\)。
- C:
過題時間:00:32:47,無罰時。
難度:大概 2100?
由於一改就是改所有字元,而且問我們要改哪幾個字元,並且不同字元間相互獨立,所以我們分開了考慮,對於每個字元把原來的字串視為關於他的 \(01\) 串,然後進行雜湊。
則詢問時要改這個字元當且僅當其在 \([l_1,r_1]\) 和在 \([l_2,r_2]\) 的雜湊值不同。
然後就做完了,複雜度 \(\Theta((n+q)|\Sigma|)\)。
- D:
過題時間:00:14:04,無罰時。
難度:大概 1000?
最簽到的題,按題意模擬即可,沒什麼好說的。複雜度 \(\Theta(n^2)\)。
- E:
過題時間:00:56:05,無罰時。
難度:大概 2300?
整場比賽質量上最出色的題。
事實上題目就是問把 P
或者 O
全部移到一棵子樹裡的代價。下面以 P
為例。
我們記錄一下一共有 \(c\) 個 P
,則我們要把 P
全部移到 \(u\) 的子樹內(並且使得其中只有 P
),那麼需要滿足 \(siz_u=c\)。
然後考慮計算代價,顯然原本就在 \(u\) 子樹內的 P
沒必要再移動,我們只需要關心把 \(u\) 子樹外的 P
移到 \(u\) 子樹內的代價。
設 \(u\) 子樹內非 P
點的集合是 \(S\),\(u\) 子樹外的 P
點集合是 \(T\),應有 \(|S|=|T|\)。則我們應將 \(x\in S\) 和 \(y\in T\) 一一配對使得 \(\sum \text{dis}(x,y)=\sum d_x+d_y-2d_{\text{lca}(x,y)}\) 儘可能小,然而我們發現 \(\sum d_x+d_y\) 是定值,且 \(\text{lca}(x,y)=\text{lca}(u,y)\),這說明了事實上配對是無意義的,也就是 \(\sum \text{dis}(x,y)\) 是個定值。
其中 \(\sum d_x+d_y\) 是很好計算的,我們考慮如何計算 \(\sum\limits_{y\in T} d_{\text{lca}(u,y)}\);我們考慮列舉 \(lca\),則 \(lca=fa_w\) 時對於答案的貢獻就是 \((g_{fa_w}-g_{w})d_{fa_w}\),其中 \(g_u\) 表示 \(u\) 子樹內的 P
點個數。
而對於點 \(u\) 我們事實上就是對於上面這個東西進行點 \(u\) 到根節點的求和,我們做一個字首和即可。
然後就做完了,複雜度 \(\Theta(n)\)。
- F:
過題時間:沒調完。
難度:大概 2400?
我們考慮把 \(t\) 串中按特殊字元的間隔把不含特殊字母的連續字串剝離出來,然後考慮把這些串丟到 \(s\) 上去匹配。
我們注意到,除了最後一個串外,其餘的串都要儘可能的往前放,感性理解一下,第一往前放不會吃虧,因為我後面能放的還是能放,第二我後面原來不能放的我現在往前放了反而能放了,這樣就更優了。
特殊地,對於最後一個當然時儘可能往後放。
至於一個地方能放上的條件就是距離上一個放串的地方中間隔的距離不小於他們兩個在 \(t\) 串中間隔得 +
數;注意對於第一個和最後一個串我們也要考慮第二個條件。
然後我們用字串雜湊一個一個匹配過去即可,複雜度是可以攤掉的,為 \(\Theta(n)\)。
- G:
過題時間:02:04:22,一發罰時。
罰時原因:手欠交了個暴力。
難度:大概 2400?
先考慮線段樹,注意到有一個 \(\Theta((n+q)m^3\log{n})\) 的矩乘做法,然而複雜度難以接受。
所以考慮分塊。設塊長為 \(B\)。
先考慮暴力如何寫,顯然時每次能攻擊就攻擊,這樣必然不虧,又能給後面的能量槽留夠空間。
對於每一個塊,我們考慮記錄兩個陣列 \(\{f_m\},\{g_m\}\) 分別表示,我最初有 \(i\) 的能量,走過這一個塊後我能量會變成多少和我能產生多少攻擊。
修改時,對於修改點所在的塊,暴力重新計算 \(\{f_m\},\{g_m\}\) 即可,複雜度 \(\Theta(mB)\)。
詢問時,整塊暴力計算,散塊使用上面得到兩個陣列可以快速計算,複雜度 \(\Theta(B+\frac{n}{B})\)。
欲令複雜度最優,由於 \(B\le mB\),則令 \(mB=\frac{n}{B}\),得 \(B=\sqrt{\frac{n}{m}}\)。
計算得此時複雜度為 \(\Theta(n\sqrt{nm})\),可以接受。
決賽
省流:八題,總榜 rk 75,小星星 rk 27,Ag。
大概是過了 t1,t2,t3,t4,t5,t6,t7,t9。
唉唉,題解擺了/shui
後面看來 t8 和 t11 大抵也差不多場上都想完了,只不過因為時間/心態因素沒有寫出來/ll