NOI 2024 前做題紀要

APJifengc發表於2024-05-25

快退役了,最後一集了

退役前還能做多少呢

To-do list #3

2024.5.24

AGC025D Choosing Points

講過

關鍵性質是距離 \(\sqrt{d}\) 的點為二分圖,於是每次選二分圖較大的一邊即可做到 \(n^2\)

證明:考察 \((x_1 - x_2)^2 + (y_1 - y_2)^2 = d\) 奇偶性,\(d\) 為奇數時 \(x_1 - x_2\)\(y_1 - y_2\) 一奇一偶,則 \(x_1 - y_1\)\(x_2 - y_2\) 一奇一偶,直接可以按照 \(x_1 - y_1\) 奇偶性劃分二分圖。\(d\) 為偶數時,考察其 \(\bmod 4\) 的值,若 \(d \bmod 4 = 2\),則發現一定有 \(x_1 - x_2\)\(y_1 - y_2\) 都是奇數,此時 \(x_1\)\(x_2\) 奇偶性不同,\(y_1\)\(y_2\) 奇偶性不同,可以劃分二分圖。否則,可以將 \(x_1, x_2, y_1, y_2\) 除以 \(2\)\(d\) 除以 \(4\),然後可以規約到前面的情況。

P9531 [JOISC2022] 復興計劃

想不到題解做法

注意到一條邊存在的寬度是一段區間,考慮求出這段寬度,然後就好做了。

考察一個寬度 \(t\) 能不能包含第 \(i\) 條邊,那麼我們就是將小於 \(|t - w_i|\) 的所有邊加入後,然後看第 \(i\) 條邊是否能加上,我們欽定邊權相同的先加左邊再加右邊,那麼注意到小於 \(|t - w_i|\) 的所有邊一定形成一個以 \(w_i\) 為右端點的字尾(或以 \(w_i\) 為左端點的字首),那麼我們可以直接列舉這個字首或字尾,看看能不能加入,然後再計算最小或最大的寬度即可,這立即得到了一個 \(O(m^2 \alpha(n))\) 的做法。注意到 \(n\) 比較小,所以我們可以嘗試找出有用的 \(n\) 條邊,也就是對於一個字首,從後往前依次加入得到的生成樹,這可以直接從前往後依次加邊維護出來,如果不連通則直接把這個邊加上,否則就把路徑上寬度最小的刪除,這樣就能維護出每個字首得到的生成樹了。

總複雜度 \(O(nm \alpha + m \log n)\)。但是這個做法好像沒法最佳化到 \(O(m(\log n + \log m) + m \log n)\)

沒腦子,想了一上午加下午半個多小時

題解做法太深刻了,就是考慮直接從大到小加入每條邊,然後考察這條邊能被加入的條件,假如加入 \(w\) 時路徑上邊權最大的邊是 \(w'\),那麼當 \(x < \frac{w + w'}{2}\) 時當前邊可以加入,否則不能加入,根據此可以得出每條邊加入的區間。

AGC021D Reversed LCS

這啥啊,這咋紫的

注意到一定選迴文子序列,直接 DP 即可,複雜度 \(O(n^3)\)

2024.5.25

vp 了一些 pkusc

太深刻了

PKUSC 2024 D1T1

列舉個迴文中心 manacher 然後二分個雜湊就行了,沒寫

PKUSC 2024 D1T2

不知道有沒有更簡單的做法,口胡的,好像有人這麼寫過了,所以應該可行

先列舉一個正方形中點到一個角的向量,正方形在凸多邊形內就是四個角在凸多邊形內,於是滿足條件的中點就是滿足這個點加四個方向的向量都在凸多邊形內的整點(或者是 \(\frac{1}{2}\) 一類的東西吧),然後可以把凸多邊形沿這四個方向移動一下取個交,得到的新凸多邊形就是中點可以在的位置,然後統計凸多邊形內整點就行了。因為交完之後凸多邊形可能不是格點凸多邊形,所以可能需要類歐統計整點啥的。

這我寫個屁。

PKUSC 2024 D1T3

只會 48 分暴力

肯定 DP 套 DP 一類的,考慮樸素 DP:

\[\begin{aligned} f_{u, 0} &= \sum_{v \in s_u} \max(f_{v, 1}, f_{v, 0})\\ f_{u, 1} &= a_u + \sum_{v \in s_u} f_{v, 0} \end{aligned} \]

直接對這個做肯定太差了,考慮某種方式把貢獻拆開,那就瞎變換一會,考慮 \(f_{u, 1} - f_{u, 0}\)

\[f_{u, 1} - f_{u, 0} = a_u - \sum_{v \in s_u} \max(0, f_{v, 1} - f_{v, 0}) \]

發現具有良好的形式,令 \(g_u = max(0, f_{u, 1} - f_{u, 0})\),則有 \(g_u = \max(0, a_u - \sum_{v} g_v)\)。同時注意到 \(f_{u, 0} = \sum_v f_{v, 0} + g_v\),那麼可以得到 \(\max(f_{1, 0}, f_{1, 1}) = \sum g_u\),那麼就把貢獻拆開了,且每個 \(g_u\) 值域只有 \(m\),可以 \(O(nm^2)\) DP 了。這個東西的大致意義就是從下到上考慮每個點選比不選會多出多少貢獻,然後求和就是答案。

最佳化不會。好像是可以推一通發現答案的生成函式一定滿足 \(G_u(x) = \frac{F_u(x)}{(1-x)^{siz_u}}\),其中 \(F_u(x)\) 是一個 \(siz_u\) 次多項式,然後資訊量只有 \(O(n)\) 了,推一下咋轉移的好像就行了,好像還要研究怎麼把多項式模 \(x^{m+1}\),太困難了我擺了。

PKUSC 2024 D2T1

考慮依次維護每個字首復原所需的操作次數與復原後對剩下的字尾的操作序列。注意到交換相鄰兩個操作不會使得局面改變,所以可以直接維護對每個點操作了多少次,每次從 \([1, i]\) 擴充到 \([1, i + 1]\),考慮 \(i+1\) 是否能還原,如果此時 \(i+1\) 操作了奇數次則不能,需要再進行一輪,將所有操作全部乘 \(2\) 即可,然後偶數就直接操作,把操作次數平分到兩個後繼。可以透過一些打 tag 操作最佳化到 \(O(n)\) 次操作,然後需要高精度,壓位高精即可做到 \(O(\frac{n^2}{w})\)

PKUSC 2024 D2T2

我的 \(O(n \log^2 n)\) 做法:注意到複合函式是單調的,所以 \(n\) 個函式複合只有 \(O(n)\) 段,可以直接線段樹維護複合函式,單次複合可以做到 \(O(n)\)\(O(n \log n)\),線段數每一層總段數是 \(O(n)\) 的,所以線段樹可以 \(O(n \log n)\)\(O(n \log^2 n)\) 建樹,然後查詢直接依次查詢每個區間的分段函式,\(O(q \log^2 n)\) 可以實現。

正解:這函式形式太優美了,就是一個值域區間 \(+1\),操作完後大小關係不會改變,所以直接拿個資料結構維護當前所有詢問,然後對函式掃描線直接模擬即可 \(O(n \log n)\)

PKUSC 2024 D2T3

不會。