或許是 oi 生涯最后做的幾道題了


這么喪不太好啊,振作起來。

最近狀態極差,省隊有點困難。

學了三年多 oi,最后 noi 都沒去過,想想都有些可惜啊。

不過能見識這么多有趣的人、有趣的算法題,我也知足了。

CF549E. Sasha Circle

將圓的一般方程寫為 \(x^2+y^2=Dx+Ey+F\) 也就是空間中一個平面和一個橢圓拋物面相交的方程。將所有點投射到橢圓拋物面 \(z=x^2+y^2\) 上,轉化為尋找一個平面分割紅藍點至兩側。

紅點的上凸包一定存在一個面滿足條件。將三維的上凸包投射到二維,是二維凸包的一個三角剖分。

凸包上每條邊所在三角形,對應這條邊極大的包含凸包的圓。可以分治去尋找這個三角剖分。

至於判定一個三角形對應圓:凸包上每條邊,經過他的所有圓圓心是一條直線,每個紅藍點會限制圓心在一個區間上。(這個維護角度的 \(\tan\) 即可。)

復雜度 \(\mathcal O(C^{2/3}(n+m))\)。代碼很具有技巧性。

CF674G. Choosing Ads

推廣 \(\mathcal O(1)\) 空間尋找一個序列的眾數的方法。

好像叫摩爾投票法。出發點是,每次刪去 \(k\) 個不同的數,出現次數 \(>\frac 1k\) 的數一定會被留下。

這東西是支持合並的,可以放到線段樹上做。至多有 \(5\) 個數超過 \(p\%\),暴力維護。

CF575E. Spectator Riots

肯定能拍齊所有人,原因類似 CF549E。

每個人可能到達的區域是個菱形,端點拿出來做凸包,答案顯然是凸包上的三個點。

對應三個點 \(i,j,k\) 構成的合法圓,如果 \((i,j)\) 之間有另外的點 \(l\),令圓不經過 \(k\) 轉而經過 \(l\),半徑會更大。因此答案一定是凸包上連續的三個點。

ARC102F. Revenge of BBuBBBlesort!

猜了個逆序對數是 3 的倍數,然后就想不動了。這篇題解 就是往這個方向做的,但是不知道怎么證明正確性。

還是去尋找一些規律。先倒過來轉為從 \(1\dots n\) 操作到排列 \(p\)

可以發現相鄰的兩個位置是不能都操作的,從任意方案最靠右的操作點開始討論可以證明。那么意味着,\(p\) 中滿足 \(p_i=i\) 的才可能成為操作點。

距離 \(\ge 2\) 的操作點互不影響,分開考慮。對於每一段內的非操作點,他在操作過程中一定只沿一個方向移動,意味着 \(p\) 中這些相同方向的點要保證有序。

線性解決。

CF809E. Surprise me!

\[\varphi(a_i\cdot a_j)=a_i\cdot a_j\cdot\frac{\frac{\varphi(a_i)}{a_i}\frac{\varphi(a_j)}{a_j}}{\frac{\varphi(\gcd(a_i,a_j))}{\gcd(a_i,a_j)}}=\frac{\gcd(a_i,a_j)}{\varphi(\gcd(a_i,a_j))}\cdot \varphi(a_i)\cdot \varphi(a_j) \]

那么枚舉 \(\gcd\) 進行莫比烏斯反演,把所有倍數拿出來建虛樹,轉化為求 \(\sum_{i,j}\varphi(a_i)\cdot \varphi(a_j)\cdot \mathrm{dis}(i,j)\)

\(\mathcal O(n\log^2n)\)

LOJ#3022. 「CQOI2017」老 C 的方塊

發現任何一個模板塊,都是藍線左右各有一個大小為 2 的連通塊。如此四色染色:

容易得到最小割建圖。

CF1288F. Red-Blue Graph

令每條邊向右流代表紅色,向左流代表藍色。那么每個點的限制可以描述為出入度的大小關系。

利用流守恆,新建虛點給予帶有下界的流量,跑上下界最小費用可行流。

LOJ#2537. 「PKUWC2018」Minimax

\(f(u,i)\) 表示 \(u\) 節點值為 \(i\) 的概率。合並左右兒子 \(x,y\) 時,有轉移

\[f(u,i)=f(x,i)\times \left(p\sum_{j<i}f(y,j)+(1-p)\sum_{j>i}f(y,j)\right)\qquad f(x,i)\neq 0 \]

\(f(y,i)\neq 0\) 同理。這樣就可以用線段樹合並維護。

LOJ#3340. 「NOI2020」命運

DP 狀態記錄子樹內未覆蓋點對中,起點深度最深的點。那么合並子樹時討論哪邊的點作為最深點,可以發現是整體 DP 的模型。

AGC010E. Rearranging

不互質的兩個數的相對順序不會發生變化,連一條邊。

Alice 需要給這張無向圖定向為 DAG,Bob 則是求一個字典序最大的拓撲序。考慮定向:

連通塊之間獨立,分塊考慮。取連通塊中最小的點,這個點一定能成為第一個點(以她為根的外向生成樹)。刪去她之后,可以遞歸的去做。

一種簡單的實現方式是邊表排序后 dfs。

CF932F. Escape Through Leaf

轉移形如 \(f_u=a_u\times b_v+f_v\),李超線段樹合並維護。

因為合並過程中,每條直線只會被下放,復雜度 \(\mathcal O(n\log n)\)

LOJ#2473. 「九省聯考 2018」秘密襲擊

將第 \(k\) 大轉化一下:

\[\begin{aligned} \sum_S \mathrm{kth}(S)&=\sum_{S}\sum_{i}[\mathrm{kth}(S)=i]i\\ &=\sum_{i}\sum_{S}\left[\mathrm{cnt}_{\ge i}(S)\ge k\right] \end{aligned} \]

可以設計 DP \(f(u,i,j)\) 表示 \(u\) 子樹中包含 \(j\)\(\ge i\) 的點的連通塊個數。最外層枚舉 \(i\) 可以做到 \(\mathcal O(Wn^2)\)

\(j\) 這一位的轉移是卷積,放到 GF 上。直接使用多項式乘法無法優化,注意到每個 \(u\) 的答案加起來也是一個 \(n\) 次多項式,帶入 \(n+1\) 個點值 DP 后再插值即可。

同時記錄 \(g(u,i)\) 為子樹內 \(f(u,i)\) 之和。此時 DP 轉移形如 \(f\) 整體加、\(f\) 區間乘、\(g\) 加上 \(f\)、兩個 \(f\) 按位乘。

設變換 \((a,b,c,d):(f,g)\to (af+b,cf+g+d)\)。因為是關於 \(f,g\) 的線性變換,滿足結合律。

由此可以線段樹合並維護,\(\mathcal O(n^2\log W)\)。(實現時需要注意內存分配。)


哎模擬賽題不改不行,先咕會兒。


免責聲明!

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



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