退役前的做題記錄2.0


upd on 2020.9.17

由於本人太鴿了,所以導致一個多月沒更這玩意了,深感抱歉。
故先把近段時間(指八九月)的一些題放在這,心血來潮的時候更。

CF793G Oleg and chess

線段樹優化連邊+掃描線:

考慮二分圖匹配就是把每一行連向能匹配該行的列然后再跑二分圖匹配,因為所有矩形不交,所以我們可以用和掃描線一樣的套路優化這個連邊過程。

具體實現細節詳見代碼。

代碼

CF464E The Classic Problem

首先暴力坑定是高精度最短路,考慮如何優化這個高精度。

如果一個點出發轉移到另一個點,那么被轉移的點的高精度位其實和轉移過來的沒差太多(只進行了一次加法),所以我們考慮用主席樹將上一個狀態繼承過來。

進位的話可以在主席樹上二分到進位的最高位,然后開一顆全\(0\)的線段樹,將置為\(0\)的區間連上來,最后將最高位設為\(1\)即可。

比較的話可以運用字符串比較的那一套理論搞個個區間蛤希值求出lcp,這樣子在主席樹上二分一次就是一個\(\log\)的,和堆套一坨就是兩只\(\log\)

我比較懶,進位是直接暴力進位的,但是 CF 沒卡所以直接過了。

代碼

CF932F Escape Through Leaf

首先想到設\(f_x\)表示跳到\(x\)的最小代價,然后直接轉移就行,復雜度是\(n^2\)的,然后優化的話如果是一條鏈李超樹可以維護這玩意兒。

樹上的話直接李超樹合並維護這個東西,因為不用 pushup 所以可以把每一層的直線直接 modify 到被合並的線段樹上,這樣子總復雜度是兩只\(\log\)的。

代碼

CF504E Misha and LCP on Tree

屎題。

直接摳出來二分+蛤希就好了,也可以用后綴數組,然而我寫的常數太大了過不去。 kk

代碼就不放了。

CF757G Can Bash Save the Day?

這個算\(\sum dis\)的套路很經典,直接把\(l,r\)中所有的點到根的路徑上加一然后用線段樹維護距離\(\times\)出現次數就好了。

這題強制在線我們就用可持久化線段樹+標記永久化來實現,因為交換相鄰兩個實際上對於前后綴是沒有影響的,只是改變了這兩個。

然后這題空間卡得比較緊需要兩個空間優化:第一個是在跳重鏈修改時不新建本次跳重鏈過程中新建的點(因為每條重鏈是無關的),另一個是在修改達到一定次數時直接清空可持久化線段樹然后重建。

代碼

CF605E Intergalaxy Trips

首先你在每個點坑定會走向期望最小的那個點,從\(1\)號點出發每個點可以被當前離他期望最小的點更新,這樣子和dijkstra很像,然而我們每次的期望時間並不是很好算,所以考慮從\(n\)倒過來求。

因為一個期望時間比當前點的期望時間長的點不會轉移到這個點,我們假設目前在期望第\(i\)小的點為\(a_i\),那么對於一個\(i\),有轉移:

\[f_{a_i}=\prod _{j=1}^{i-1}(1-p_{a_i,a_j})+\sum_{j=1}^{i}f_{a_j}p_{a_i,a_j}\prod_{k=1}^{j-1}(1-p_{a_i,a_k}) \]

\(q_i=\prod_{j=1}^{i-1}(1-p_{a_i,a_j})\),把和\(f_{a_i}\)有關的全部放到一遍解方程即可,然后每次去最小的類似於dij更新\(f,q\),復雜度\(O(n^2)\)

代碼

CF183D T-shirt

因為期望具有線性性,所以把可以先把每一件衣服買多少件送出多少件的概率dp出來最后再背包一遍,形式化的,就是:

\(f[i][j][k]\):第\(i\)件衣服,前\(j\)人喜歡的有\(k\)人的概率。

\(g[i][j]\):買了第\(i\)種衣服\(j\)件,送出個數的期望。

\(f\)很好dp,\(g[i][j]=\sum_{k=0}^{j-1} k\times f[i][n][k] + \sum_{k=j}^n j\times f[i][n][k]\)

發現這樣子是\(O(mn^2)\)的。

\(g\)數組的相鄰兩項作差,發現\(g[i][j]-g[i][j-1]=\sum_{k=j}^n f[i][n][k]=1-\sum_{k=0}^{j-1}f[i][n][k]\)

也就是說隨着\(j\)增大,他們之間的差值單調減小,每次選最大的貪心就好了,然后每次更新完再更新當前的\(f\)

代碼

CF526G Spiders Evil Plan

先轉化一下問題:選\(k\)條路徑出來一定對應了\(2k\)個葉子,而這\(2k\)個葉子中一定有一個是直徑的一個端點,我們分別把直徑的兩個端點拿出來,那么問題就轉化為把這個直徑端點作為根,選出\(2k-1\)個葉子節點到根的路徑不重復算的最大邊權和為多少。

假設現在我們沒有必須包含\(x\)的限制,對於這個問題有一個十分巧妙的貪心方法:長鏈剖分后依次選擇最長的幾條長鏈。

然而現在必須包含\(x\)了,怎么辦呢?

如果\(x\)本來就包含在這些長鏈里,直接照常貪心即可。

否則的話分為兩種情況:第一種是把\(x\)接在離他最近的長鏈中的一個點上,並刪去該長鏈其他子樹,第二種是直接從\(2y-2\)條鏈的狀態轉移過來,直接往上拼接。

代碼

[NOI2019]彈跳

KD樹優化連邊,可以只建出KD樹原來有的邊,轉移時直接在KD樹上更新,有個可以剪枝的地方就是如果某個點的祖先已經被更新過了就不繼續往下遞歸了。

代碼

[PA2014]Muzeum

首先一眼一個最大權閉合子圖,然后就是想辦法優化求最小割。

先把坐標轉一下:
對於一個警衛\(a\)可以看到文物\(b\),有\(\frac {y_a-y_b}{x_a-x_b}\leq \frac hw,\frac {y_a-y_b}{x_a-x_b}\geq -\frac hw\)
把每個坐標\((x,y)\)轉化為\((x\times h+y\times w,x\times h-y\times w)\),可以得到一個警衛\(a\)看到一個文物\(b\)當且僅當\(x_b\leq x_a,y_a\leq y_b\)
把最小割轉化為最大流。
我們可以從左到右進行掃描線,拿個 multiset 維護當前還有容量的文物的\(y\)坐標以及容量,然后每個警衛找他可以流的\(y\)最小的文物,一直這樣匹配即可。
正確性的話就是說\(y\)越小肯定能流的就越少,把限制強的流完一定是綴好的。

代碼

[APIO2012]守衛

先預處理出不被\(0\)覆蓋的點,然后對每個點處理出在它左邊離他最近的點和在他右邊離他最近的點。

於每個至少存在一個忍者的區間,先將它左右邊界處理為不被\(0\)所覆蓋。按左端點排序后將包含其他區間的區間去除。

貪心求出前\(i\)個區間最小忍者數\(f_i\)和后\(i\)個區間最小忍者數\(g_i\),那么最優的話肯定是左邊全放在右端點,右邊全放在左端點。

對於某個未確定的位置\(i\)進行判斷,因為盡量靠左最好,所以我們新加入一個代替該位置的點\(i-1\),二分出左邊不包含它的最右區間\(x\)以及右邊的最左區間\(y\),如果\(f_x+g_y+1\)使得答案變大說明該點必選。

代碼

[USACO20OPEN]Exercise G

把所有\(p_i\)\(i\)連邊,比較顯然的結論就是循環大小是所有環長度的\(\text{lcm}\)

但是現在還是不好求,考慮一個環\(len=\prod p_i^{r_i}\),把它拆成所有\(p_i^{r_i}\)和一堆\(1\)一定是可以的,所以我們直接背包再前綴和優化一波就完事了。

代碼

[USACO20OPEN]Exercise P

CF1093F Vasya and Array

[IOI2019]天橋

[ZJOI2020] 傳統藝能


[JSOI2019]神經網絡

考慮把依次經過的樹寫成一個序列並放在一個環上,那么這個序列所要滿足的條件就是開頭必須是\(1\),相鄰的兩個數不相同且首尾不能均為\(1\)(如果均為\(1\)的話會算重)。
對於每一棵樹,我們可以設\(f_{i,j,0/1/2}\)表示以\(i\)為根,將這棵樹划分為\(j\)條鏈,\(i\)已經連了\(0/1/2\)條邊的方案數,這樣就可以把一棵樹划分為\(i\)條鏈的方案數算出來了,因為這題鏈有方向,所以節點數\(>1\)的鏈方案要乘\(2\)
\(f_i\)表示某棵樹划為\(i\)條鏈的划分數,構造EGF。
首先我們不考慮\(1\)的情況,那么有

\[F(x)=\sum_{i=1}^{n}f_i\times i!\sum_{j=0}^{i-1}{i-1\choose j}(-1)^j\frac {x^{i-j}}{(i-j)!} \]

其中\(i!\)是他們內部排列數,\({i-1\choose j}\)是強制相鄰的兩個並起來的方案數,\((-1)^j\)是容斥系數。
\(1\)考慮進來,就是我們欽定\(1\)中的第一個數必須放在第一個位置除去環的限制,它不參與內部排列也不參與外部排列,那么有

\[F(x)=\sum_{i=1}^{n}f_i\times (i-1)!\sum_{j=0}^{i-1}{i-1\choose j}(-1)^j\frac {x^{i-j-1}}{(i-j-1)!} \]

最后再減去考慮首尾均為\(1\)的情況,那么就是最后一個點不參與外部排列但參與內部排列:

\[F(x)=-\sum_{i=1}^{n}f_i\times (i-1)!\sum_{j=0}^{i-2}{i-1\choose j}(-1)^j\frac {x^{i-j-2}}{(i-j-2)!} \]

最后把所有EGF卷起來把\([x^i]\)乘上\(i!\)再相加就是答案。
代碼

[JSOI2019]精准預測

這個題的約束條件很像\(\text{2-sat}\),往這方面考慮。
題目所給的約束條件可以直接連邊,還有約束條件的話就是如果一個人在\(t\)時刻活着那么在\(t-1\)時刻活着,在\(t\)時刻死了那么在\(t+1\)時刻死了。
然后再看每個點\(T+1\)時刻死了能到達多少個其他點活着的就行了,假設有\(cnt\)個,那么該點的答案就是\(n-cnt-1\),這個可以通過\(\text{bitset}\)優化拓撲排序dp求出。
但是\(\text{bitset}\)還是存不下所以要分段跑,注意如果一個點必死那么它不能算進貢獻。
代碼

[TJOI2018]party

考慮我們算LCS的dp:\(f_{i,j}\)表示第一個序列到\(i\),第二個到\(j\)的LCS長度。
那么有\(f_{i,j}=\max\{f_{i-1,j},f_{i,j-1},f_{i-1,j-1}+[a_i=b_j]\}\)
如果我們現在固定\(i\),對於相鄰的\(j\)\(f\)的差值不超過\(1\),可以考慮把對於每個\(j\)的增量狀壓下來。
然后對於一個 mask 的轉移可以預處理出來,對於NOI的限制再多記一維狀態就可以了。
代碼

[NOI2016]循環之美

考慮最簡分數\(\frac ab\)\(m\)進制下是純循環小數的條件:
第一位的余數是\(a\bmod b\),第\(x\)位的余數是\(a\times m^x\bmod b\)
我們要滿足的條件就是\(a\equiv a\times m^x\bmod b\)
因為\((a,b)=1\),所以\(m^x\equiv 1\bmod b\),若\((m,b)=1\)\(x=\varphi(b)\),否則無解。

所以題目轉化為

\[\sum_{i = 1}^n \sum_{j = 1}^m [i \perp j][j \perp k] \]

然后推下式子:

\[\begin{aligned} &\sum_{i = 1}^n \sum_{j = 1}^m [i \perp j][j \perp k]\\ =&\sum_{i = 1}^n \sum_{j = 1}^m [j \perp k] \sum_{d | i, d | j} \mu(d)\\ =&\sum_{d = 1}^n \mu(d) \sum_{d | i} \sum_{d | j} [j \perp k]\\ =&\sum_{d = 1}^n [d \perp k] \mu(d) \left\lfloor \frac nd \right\rfloor \sum_{j = 1}^{\lfloor\frac md\rfloor} [j \perp k]\\ \end{aligned} \]

\(f(n) = \sum_{i = 1}^n [i \perp k], g(n, k) = \sum_{i=1}^n \mu(i)[i \perp k]\)
顯然\(f(n) = \left\lfloor \frac nk \right\rfloor f(k) + f(n \bmod k)\)
推下\(g\)

\[\begin{aligned} g(n, k) &= \sum_{i = 1}^n \mu(i)[i \perp k]\\ &= \sum_{i=1}^n \mu(i) \sum_{d|i, d|k} \mu(d)\\ &= \sum_{d|k} \mu(d)\sum_{d|i} \mu(i)\\ &= \sum_{d|k} \mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor} \mu(id)\\ &= \sum_{d|k} \mu^2(d)\sum_{i=1}^{\lfloor\frac nd\rfloor} \mu(i)[i \perp d]\\ &= \sum_{d|k} \mu^2(d) g\left(\left\lfloor \frac nd \right\rfloor, d\right) \end{aligned} \]

\(k=1\)時無法遞歸,需要杜教篩\(\mu\),然后就做完了。
代碼

[TJOI/HEOI2016]字符串

如果沒有右端點的限制就直接\(\text{SA}+\)主席樹查區間前驅后繼就好了,但是現在有右端點的限制我們可以考慮二分將這個限制去掉,再用主席樹查詢即可,復雜度\(O(n\log^2n)\)
代碼

[NOI2017]蔬菜

考慮賣一定數量的菜所能帶來的最大收益:我們將菜按錢數從大到小加入,並且選能選的最后一天放(可以用並查集維護),因為后面的天可以,前面的天就一定可以,所以最終查詢直接查詢賣\(m\times p\)棵菜能夠賺到的最多的錢數即可,細節詳見代碼。
代碼

[CEOI2017]Mousetrap

假設所給的樹以陷阱為根。
考慮兩點相鄰的情況,設\(f_x\)為以\(x\)為根的子樹下來再上去所需的最小步數,那么每次你最優肯定是堵\(f\)最大的這時候老鼠就會往次大的\(f\)走,\(f\)可以dp出來。
問題是現在不相鄰,對於往上走再往下的情況我們不好處理,那么考慮二分答案\(\text{mid}\),就可以算出陷阱到鼠的鏈上哪些點一定要堵住,就可以\(\text{check}\)出來不來得及了。
代碼

[HNOI2012]三角形覆蓋問題

自適應simpson+玄學調參
代碼

[SNOI2019]字符串

后綴排序后就是\(\text{ST}\)\(+\text{Sort}\)的事了
代碼

[JSOI2019]節日慶典

可以維護出可能出現的最小的后綴的集合,發現集合中的數不超過\(\log n\)個。
證明參考 zsy 的:
簡單證一下這個性質:考慮相鄰的兩個最小后綴\(i,j\),若\(|j|<|i|<2|j|\),則說明\(i=AAB,j=AB\),其中\(A,B\)均為字符串,且\(B\)\(A\)的一個嚴格前綴。此時考慮\(i=AAB,j=AB,k=B\),可以發現無論如何最小后綴都會在\(i\)\(k\)之間產生,\(j\)不可能成為最小后綴(如果\(j\)\(i\)優,那么一定有\(k\)\(j\)優),由此說明相鄰兩個最小后綴的長度至少\(\times 2\),因此數量不超過\(\log n\)
這題的數據范圍較大,所以維護\(lcp\)時食用\(\text{Z-algorithm}\)維護。
代碼

[POI2013] Tower Defense Game

發現如果選擇一個沒有被其他點覆蓋的點的話一定可以覆蓋到原來\(K\)個點之中的一個點。
所以沒選則選就好了。

代碼

[POI2011] Party

考慮刪點。
對於沒刪的一對點\(u,v\),如果他們之間沒有直接連邊的話肯定沒在\(\frac 23N\)的團中。
那我們可以把這個\(u,v\)都刪掉,可以保證剩下的點一定構成一個團。
代碼

AT3557 Four Coloring

曼哈頓距離轉切比雪夫距離。
然后按照

\[\begin{aligned} &\text{ABAB}\\ &\text{CDCD}\\ &\text{ABAB}\\ &\text{CDCD} \end{aligned} \]

構造塊,每個塊的大小為\(K\times K\)就行了。
代碼

CF989C A Mist of Florescence

如果題目給我們\(50\times 50\)的話那我們就整個利用好。
考慮將\(50\times 50\)分為\(4\)\(25\times 25\)
在不分割\(25\times 25\)的前提下將其他顏色填進來就可以很簡單的構造了。
代碼

AGC004C And Grid

構造一個集合為奇數行+第一列+原圖,一個為偶數行+最后一列+原圖。
代碼

CF576C Points on Plane

將每個坐標\((x_i,y_i)\)看作區間。然后就是莫隊了。
代碼

CF618F Double Knapsack

考慮加強題目限制:子集\(\rightarrow\)子區間。
分別記錄前綴和,假設第一個集合的總和小於第二個集合。
從左往右掃第一個集合假設現在的前綴和為\(p\),用單調指針在第二個集合前綴和中lower_bound,設為\(q\)
那么\(0\leq q-p<n\)
如果為\(0\)我們就找着了,否則的話根據抽屜原理一定會存在一對\(p,q\)差相等,減一下就完事了。
代碼

[LG3599]Koishi Loves Construction

首先對於第一問,\(N\)必須要放在第一個。
那么對於所有數的和需要滿足\(N\nmid \frac {N\times(N+1)}2\),所以\(N\equiv 0(\bmod 2)\)
然后構造一個這樣的序列即可:\(N,1,N-2,3,N-4...\)
然后考慮第二問,\(N\)必須要放在最后一個。
而且需要滿足\(N\nmid (N-1)!\),發現\(N\)只能為\(1,4\ or \ \text{Prime}\),對於\(1,4\)我們可以打表。
質數的話可以打表發現\(1,\frac 21,\frac 32,\frac 43...\frac {n-1}n,n\)可以,或者構造原根為\(g\),像加法那樣構造\(g^0,g^1,g^{N-3},g^3,g^{N-5}...\)
代碼

CF909F AND-permutations

首先考慮第一問,顯然有\(N\)為偶數。
考慮怎么構造,可以想到\(i\)\(i\)按位取反交換,但是這樣的話有可能或超過\(N\)
\(k\)\(N\)二進制為中的最高位,\(2^k\)\(2^k-1\)交換,\(2^k+1\)\(2^k-2\)交換,以此類推。那么我們交換了\(2^k\)\(N\),也交換了\(2^k-(N-2^k+1)\)\(2^k-1\),剩下了\(1\)\(2^k-(N-2^k+1)-1\),再遞歸處理即可。
第二問的話,考慮交換\((2,3),(4,5),(6,7)...\)
最后會剩下\(1\)或者\(1,N\),如果\(N\)為奇數則剩下\(1\),直接將前\(7\)個改為\(7325641\)即可,小於\(7\)直接爆搜。
如果為偶數的話\(N\)為二的冪無解,把\(1\)和最后三個數的順序變為\(N-1,N,1,N-2\)即可。
代碼

AT5761 Odd Sum Rectangles

\(\mathsf{\color{black}{I}\color{red}{tst}}\)的放上來

CF593C Beautiful Function

假設所有圓上的點都過圓心,於是我們可以讓\(f(i)=x_i,g(i)=y_i\),因為兩種方法的構造情況其實是一樣的,所以在這里我們只考慮\(x\)
\(t=|i-x|,x\in \mathbb Z\)
有這樣一個式子\(1-t+|1-t|\)當且僅當\(t=0\)時有值且為\(2\),那么我們直接在這個式子外邊乘上\(\lfloor\frac {x_i}2\rfloor\),就可以保證當\(x=i\)時值為\(x_i\)了,因為題目保證\(r\geq 2\)所以\(1\)的誤差沒關系。
代碼

CF537C Bear and Drawing

發現一個可以畫出的樹必然是有一個主干和若干個枝條構成的,像下面這樣:
CF573C-1.png

那么我們可以將所有枝條中除了Y字形態的都給剪下來,那么現在樹上就剩下了Y字枝條和主干。
考慮如何判斷Y,就是看它的鄰居中是否只有一個沒有被剪下來,那么我們再對於主干判斷一下有沒有一個主干的鄰居超過兩個主干就好了。
代碼

CF750F New Year and Finding Roots

隨機從一個點開始,可以通過兩次類似於\(\text{dfs}\)的詢問確定訪問到深度最淺的點\(x\)以及它的深度。
再從\(x\)出發類似地繼續找到一個深度最淺的點\(y\),如果\(y\)的深度是\(2\ \text{or}\ 3\)就直接往上\(\text{bfs}\),否則再用類似的方法繼續找。
代碼

CF1060H Sophisticated Device

首先快速乘是很好模擬的。
然后想辦法弄出一個\(0\)的位置,就是將一個\(1\)乘上\(p\),乘法可以食用快速乘。
其他的運算:減法:乘上\(p-1\),除法:乘上逆元。

看我們如何求出\(xy\),有\(xy=\frac {(x+y)^2-x^2+y^2}2\),那么現在我們要想辦法求出平方。
\(x^2=\sum_{i=0}^d a_i(x+i)^d=\sum_{j=0}^d{d\choose j}x^j\sum_{i=0}^di^{d-j}a_i\),可以欽定平方項為\(1\)其他為\(0\)然后高斯消元。

平方弄出來這題我們就做完了,寫的時候耐點心。
代碼

CF1044B Intersecting Subtrees

其實只要用兩次操作,第一次從\(B\)集合中選出一個點找到它在\(A\)中的位置然后把它作為根,再從\(A\)中找出深度最淺的點詢問在不在\(B\)中即可。這樣是對的是因為根不滿足意味着其他點也一定不滿足。
代碼

CF1146C Tree Diameter

想辦法把直徑兩端分在不同集合:每次按每個二進制位分組即可。
代碼

CF830E Perpetual Motion Machine

分情況考慮:
如果存在一個環,那么令環上的點權值為\(1\),其余點權值為\(0\)

如果存在一個度數大於\(3\)的點,令這個點的權值為\(2\),和它相鄰的點權值為\(1\),否則權值為\(0\)

如果存在兩個度數等於\(3\)的點,令這兩個點的路徑上點的權值為\(2\),其余的點權值為\(1\)

如果沒有度數為\(3\)的點,說明是很多條鏈,由簡單的不等式知識知道這肯定不行。

還有一種情況比較麻煩,有一個度數為\(3\)的點,那一定是這個點引出三條鏈,設這三條鏈長度分別為\(p,q,r\),有解當且僅當\(\frac 1p+\frac 1q+\frac 1r\leq 1\),下面進行證明:
設三條鏈上的點權由遠及近為\(x_1,x_2...x_p\),\(y_1,y_2...y_q\),\(z_1,z_2...z_r\),且\(x_p=y_q=z_r=v\)

\[A_x=x_1^2+x_2^2+...+x_{p-1}^2-x_1x_2-x_2x_3-...-x_{p-1}v\\ A_y=y_1^2+y_2^2+...+y_{p-1}^2-y_1y_2-y_2y_3-...-y_{q-1}v\\ A_z=z_1^2+z_2^2+...+z_{p-1}^2-z_1z_2-z_2z_3-...-z_{r-1}v \]

那么我們想關注\(S=A_x+A_y+A_z+v^2\)的正負性,我們將等式兩邊同時\(\times 2\),正負性不改變
也就是\(2S=2A_x+2A_y+2A_z+2v^2\)
其中$$2A_x=\sum_{i=1}^{p-1}\frac{i+1}{i}(x_i-\frac {i}{i+1}x_{i+1})^2-\frac {p-1}{p}v2=F(x)-\frac{p-1}pv2$$
\(A_y,A_z\)同理,這里不展開。
然后\(2S=F(x)+F(y)+F(z)-\frac {p-1}{p}v^2-\frac {q-1}{q}v^2-\frac {r-1}{r}v^2=F(x)+F(y)+F(z)+(\frac 1p+\frac 1q+\frac 1r-1)v^2\)
想要\(S\leq 0\)必然滿足\(\frac 1p+\frac 1q+\frac 1r\leq 1\),構造的方法可以根據\(F(x),F(y),F(z)\)來構造。
代碼

CF835E The penguin's game

詢問一個集合的異或和結果有\(4\)種,分別為\(0,x,y,x\oplus y\)
首先將所有下標依次按照每個二進制位\(01\)分類,詢問異或和即可得到兩個\(y\)下標的異或值。
之后再將兩個下標不在一個集合的集合拿出來,再該集合內二分即可。
代碼

ARC103D Distance Sums

從葉子往上推。
\(D\)從大到小排序后,\(D\)最大的點\(x\)一定是葉子,根據換根的那一套理論,如果滿足\(y\)\(x\)的父親那么就有\(D_x+sz_x-(n-sz_x)=D_y\),因為等式左邊的量都已知,所以我們可以直接把\(y\)二分出來。
這樣子一步步構造就好了。
值得注意的一點是,構造完一顆樹后要把一個點的\(D\)帶進去檢驗,因為我們只有\(n-1\)個等式,而變量有\(n\)個,我們值確定了變量之間的關系,而未確定變量的具體值。
代碼

CF566E Restoring Map

首先考慮非葉子節點數目至少為\(3\)的情況,
兩個非葉子節點\(x,y\)之間存在邊當且僅當存在兩個集合的交為\(\{x,y\}\),所以我們可以知道所有非葉子節點之間的連邊情況,也確定了所有葉子節點。
對於一個葉子節點,包含它且集合大小最小的點就是它自己的集合,這樣我們可以確定每個葉子節點的集合。
定義連邊集合葉子節點連向葉子節點的邊的集合,那么把每個葉子節點集合中的葉子去掉之后就是其父親節點的連邊集合,因為每個非葉子節點的連邊集合不同而且上面已經確定了連邊集合,所以可以確定每個葉子的父親,這棵樹也就確定了。
如果非葉子節點數目小於\(3\),比較容易判斷,這里不再贅述。
代碼

CF1053E Euler tour

考慮一個歐拉序合法的條件:

  • \(a_1=a_{2n-1}\)
  • \(\forall a_l=a_r,l,r\)同奇偶,因為其子樹內每條邊貢獻次數均為\(2\)
  • \(\forall a_{l1}=a_{r1},a_{l2}=a_{r2}\)\([l1,r1]\)有交則是包含關系

考慮如何構造,假設當前我們構造的區間為\([l,r]\),從左往右掃,如果發現有\(a_{l'}=a_{r'}\),那么遞歸構造\([l',r']\),然后刪掉\([l',r']\),刪的過程可以用鏈表維護。

剩下的兩兩肯定不能匹配,我們可以統計一下這個區間的空位置的個數,如果我們區間內空位置的個數不足以讓我們匹配完全,那么就是無解,否則如果我們區間中數的種類小於\(\lceil\frac {r-l}2\rceil\),我們就在\([l,r]\)前面沒有天的位置填上未在整個序列中出現過的數,之后再從\(l\rightarrow r\)考慮每個長度為\(3\)的區間,如果是\(0xy\)就變為\(yxy\)\(xy0\)就變為\(xyx\),然后縮點。如果區間里還有數為\(0\)就全部賦為這個區間的根。
正確性的話因為我們能夠保證賦為根之前不會有兩個\(0\)是相鄰的所以是對的。

鏈表維護的復雜度為\(O(n)\),具體實現細節見代碼。
代碼

CF538G Berserk Robot

在這里


免責聲明!

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



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