退役前的做題記錄4.0
最近主要在LOJ上寫題
536. 「LibreOJ Round #6」花札
比較顯然的二分圖博弈模型,先手必勝當且僅當起始點一定在最大匹配中。連邊可以對每種顏色以及數字建一個點優化到\(O(n)\),一定在最大匹配中的點就是源點不能到達的左側的點。
556. 「Antileaf's Round」咱們去燒菜吧
生成函數大致就是一大堆\(1-x^v\)乘乘除除的形式,轉成對數后根據\(\ln(1-x^v)=-\sum_{i=1}^{\infty}\frac{x^{vi}}{i}\),先\(O(n\ln n)\)地求出\(\ln F(x)\)再\(\exp\)回來即可。
558. 「Antileaf's Round」我們的 CPU 遭到攻擊
裸的\(LCT\)維護子樹信息,在\(splay\)的每個點上維護“子樹內(這里指原樹的子樹)所有黑點到這棵\(splay\)最左/右的點的距離之和”即可。注意\(reverse\)操作要交換左/右的答案。
2351. 「JOI 2018 Final」毒蛇越獄
存在一個復雜度\(O(2^{\#?})\)的做法:直接枚舉\(?\)填什么即可。
存在一個復雜度\(O(2^{\#0})\)的做法:求超集和並對所有的\(0\)位置容斥。
存在一個復雜度\(O(2^{\#1})\)的做法:求子集和並對所有的\(1\)位置容斥。
發現\(\min(\#?,\#0,\#1)\le 6\),所以復雜度\(O(n2^n+q2^6)\)。
2483. 「CEOI2017」Building Bridges
簡單斜率優化。發現橫坐標不單調怎么辦?
不想寫\(CDQ\),直接一發二進制分組美滋滋。
式子化出來相當於是要求\(\min\{kx_i+y_i\}\),可以理解為是最小化向量\((x_i,y_i)\)與向量\((k,1)\)的點積,而最小化點積的點一定在下凸殼上,所以維護下凸殼即可。
2496. 「AHOI / HNOI2018」毒瘤
暴力就是枚舉每條非樹邊的狀態(要么強制一者不選,要么強制前者選后者不選),\(O(2^{m-n+1}n)\)。
發現很多轉移都是重復的,所以可以對\(2(m-n+1)\)個點建虛樹,並求出虛樹上每條邊分別對應的\(f_{v,0/1}\to f_{u,0/1}\)的轉移系數。復雜度\(O(n+2^{m-n+1}(m-n+1))\)。
2509. 「AHOI / HNOI2018」排列
序列中的最小值一定會在其父親被選后立即被選,於是就可以與其父親合並成一個大塊。將最優化的式子划一划會發現只要優先選平均值最小的塊就行了,於是用某個數據結構維護一下即可。
2512. 「BJOI2018」鏈上二次求和
考慮某個單點\(x\)上的權值\(v\)對答案數組的影響:初始斜率為\(v\),在\(x+1\)后斜率減\(v\),在\(n-x+2\)后斜率減\(v\),那么在\(1,x+1,n-x+2\)三處打上標記再做三次前綴和即可得到答案數組的區間和信息。現在單點變成了區間,相當於是變成了四階差分。做四次前綴和后\(ans_r=\sum_{x=1}^r\frac{(r-x+1)(r-x+2)(r-x+3)}{6}d_x\),所以只要用樹狀數組維護\(\sum d_x,\sum d_xx,\sum d_xx^2,\sum d_xx^3\)即可。
2513. 「BJOI2018」治療之雨
列出方程后發現每行在主對角線上只有一個非零位,於是直接自底向上大力高消就行了。
2525. 「HAOI2018」字串覆蓋
之前看到這題以為刪掉一個子串后前后拼起來可以繼續刪感覺不可做就棄了,結果今天回來一看發現。。。這是啥。。。
對於給定區間,一定是從前往后能刪則刪最優。
部分分提示地很明顯了。當\(r-l\)足夠大時,直接在給定區間內暴找所有的合法區間,最多不會超過\(\frac{n}{r-l+1}\)個。找的過程可以用主席樹維護(下標,后綴排序名次)的二維點集,所以復雜度是\(O(q\frac{n}{r-l+1}\log n)\)的。
當\(r-l\)較小時以上方法就不再適用了。但此時我們可以直接對每個長度預處理其后繼,然后用倍增優化暴跳的過程,這里的復雜度是\(O((r-l)n\log n+q\log n)\)的。
兩者結合即可。注意最好離線否則第二種方法的空間消耗將難以接受。
2572. 「ZJOI2017」字符串
一個結論是一個區間內可能成為最小后綴的后綴數量是\(O(\log n)\)的,證明是考慮兩個可能后綴\(a,b\),若\(|b|<|a|<2|b|\),則\(a\)存在一個長度為\(|a|-|b|\)的周期,設\(a=TTc,b=Tc\),\(c\)是\(T\)的一段前綴,可以發現此時\(b\)一定不會成為最小后綴(因為在這種情況下要么取\(TTc\)要么取\(c\)),因此相鄰兩個可能的最小后綴之間長度至少是\(2\)倍。
所以只需要用線段樹維護一下區間可能成為答案的后綴位置即可。維護后綴排序可以直接二分+哈希,由於待修改,所以可以分塊維護哈希數組,這樣可以做到修改\(O(\sqrt n)\)查詢\(O(1)\),這樣總復雜度就是\(O(n\sqrt n+n\log^2n+m\sqrt n+m\log^3n)\)。
2710. 「BalkanOI 2018 Day1」Election
離線以后右端點往右掃,維護一個棧式結構以保證所有后綴和大於等於\(0\)。具體方式是遇到一個\(-1\)就加入棧中,遇到一個\(1\)就將棧頂彈出。接下來就只需要考慮使前綴和大於等於\(0\),可以直接用線段樹維護一下區間最小值,同時注意考慮在前一步中刪去的一些\(-1\)對后一步操作的影響。
2712. 「BalkanOI 2018 Day1」Minmaxtree
對每條邊求出它可以選擇的權值范圍,可以發現在上界與下界中選擇其一一定不會更劣,所以問題就轉化成了給每種權值找一條邊使得所有權值都出現,直接二分圖匹配\(O(n\sqrt n)\)就完事了。
至於怎么求權值范圍,可以將權值排序后依次加入,這樣每次操作就變成了“給路徑上還沒有染色的邊染上一種顏色”,直接並查集維護即可。復雜度\(O(n\log n+n\alpha(n))\)。
2803. 「CCC 2018」平衡樹
這個\(dp\)式大致長成\(dp_n=\sum_{k=1}^ndp_{\lfloor\frac nk\rfloor}\)。直接把需要用到的\(O(\sqrt n)\)個位置拿出來在數論分塊轉移就行了。
2804. 「CCC 2018」最大戰略儲備
可以理解為一張\(n\times m\)的網格圖,每條邊可以合並兩行/兩列。所以還是按照邊權排序依次加邊,維護一下當前網格圖還剩下多少行多少列就行了。
2834. 「JOISC 2018 Day 2」修行
相當於是要求有多少排列\(p\)滿足\(p_i>p_{i+1}\)的\(i\)的個數恰好為\(k-1\)。
轉化為求期望。這個期望等價於\(n\)個\([0,1)\)隨機變量\(a\)滿足\(a_i>a_{i+1}\)的\(i\)的個數恰好為\(k\)的概率,而這樣的\(a\)又可以一一對應為\(n\)個\([0,1)\)隨機變量\(b\)的前綴和的小數部分,其中當\(a_i\le a_{i+1}\)時前綴和整數部分不變,否則整數部分\(+1\)。
於是變成了求\(k-1\le\sum b_i<k\)的概率。
先把\(b_i\in[0,1)\)的限制容斥掉,然后就變成了求\(n\)個\([0,+\infty)\)隨機變量之和\(<k\)的概率。這個概率實際上等於\(\frac{k^n}{n!}\)。
2840. 「JOISC 2018 Day 4」糖
鏈表模擬費用流,即每次選最大的,然后將其前驅后繼刪除,加入一個新的決策為:反悔當前決策,改為選擇該點的前驅后繼決策。注意這里的決策是遞歸定義的。
2879. 「JOISC 2014 Day3」JOIOJI
設\(J=2,O=I=-1\)並做前綴和,這樣一個區間的區間和為\(0\)就說明\(J\)的個數恰好是區間長度為\(\frac 13\)。做三個前綴和后找到三維全都相等的兩個前綴相減就是答案。
2882. 「JOISC 2014 Day4」兩個人的星座
兩個不交的三角形一定存在恰好兩條頂點之間的連線把它們分開,於是先枚舉一個點,極角排序后再依次枚舉第二個點,同時維護兩點連線分隔開的兩個半平面內三種顏色分別有多少個,這樣便可以方便地求出答案。最終每對三角形會被算\(4\)次,所以答案除以\(4\)即可。
3010. 「JOI 2019 Final」勇者比太郎
怎么\(JOI\)還有這種送分題啊\(qwq\)
3011. 「JOI 2019 Final」畫展
展出的畫一定會放在若干個最大的畫框里,所以考慮貪心,按美觀度從大到小嘗試放入當前的最大畫框即可。
3012. 「JOI 2019 Final」有趣的家庭菜園 3
從前往后\(dp\),設\(f_{i,j,k,0/1/2}\)表示三種顏色分別放了\(i,j,k\)個且最后一個顏色為\(0/1/2\)的最小代價。轉移枚舉接下來放哪一種顏色,根據原序列中每種顏色的出現位置計算一下代價就行了。
6101. 「2017 山東二輪集訓 Day1」第二題
建出笛卡爾樹后可以發現每次的\(k\)塊磚頭必須放在一條直鏈上(即任意兩點均存在祖孫關系),所以從每個葉子開始放就行了。
6105. 「2017 山東二輪集訓 Day2」第三題
因為\(C_i\)無交所以直接看做點權,如果\(i\)向\(A_i\)中的每個元素連邊那么會連出一張\(DAG\),\(B_i\)實際上就是這張\(DAG\)上\(i\)點所有支配點的點權之和加上自身,也就是其在支配樹上的深度。所以直接維護支配樹即可,由於查詢的內容是鏈並,所以可以用\(LCT\)打標記以及鏈上二分的方式搞搞。
6140. 「2017 山東三輪集訓 Day5」Dark
題面不知道在講什么。令\(ans=\sum_{d|n}\frac{n!}{(d!)^{\frac nd}(\frac nd)!}\),要求的東西是\(m^{ans}\mod P\)。所以直接盧卡斯就好了。
6142. 「2017 山東三輪集訓 Day6」A
如果\(n\)是奇數,那么\(\binom{2n}{n}\)種情況之間可以恰好一一對應,且對應的兩種情況中偶數個數的奇偶性不同,所以答案除以\(2\)即可。
如果\(n\)是偶數,結論是當\(n\)是\(4\)的倍數時答案為\(\frac{\binom{2n}{n}+\binom{n}{n/2}}{2}\),否則答案為\(\frac{\binom{2n}{n}-\binom{n}{n/2}}{2}\)。
6144. 「2017 山東三輪集訓 Day6」C
\(Xor\)可以打全局標記,然后在\(Trie\)樹上走的時候就只需要根據標記判斷方向即可。
\(And\ 1\)與\(Or\ 0\)操作沒有意義,\(And\ 0\)與\(Or\ 1\)會使所有數在某一位上由不同變得相同,而這種“由不同變得相同”只有至多\(O(\log a_i)\)次,所以每次暴力重構就行了。
6146. 「2017 山東三輪集訓 Day7」Normal
循環卷積+單位根反演。
設一個步長的生成函數為\(A(x)\),要求的相當於是\(\sum_{i=0}^T[k|i]\binom TiA(x)^i\),這里的乘法定義為循環卷積。顯然答案等於\(\frac 1k\sum_{i=0}^{k-1}(1+\omega_k^iA(x))^T\)。
由於\(n\)是\(2\)的次冪,所以直接\(NTT\)就可以實現循環卷積。
6157. A ^ B Problem
直接\(dfs\)就行了。
6275. 棋盤
顯然不能把\(k\)記到狀態里去。如果定義當前局面的權值為\(連通塊個數x^{\mbox{連通塊個數}}\),那么就只要把\(\omega^0\)至\(\omega^{k}\)代入再\(IDFT\)回來就可以得到答案了。
考慮怎么對於給定的某個\(\omega^i\),求所有局面的總權值之和。由於\(n\)很小所以可以對每列狀壓並記錄連通性(同構的部分可以一起轉移,在\(n=1\)時狀態數為\(2\),\(n=2\)時為\(3\),\(n=3\)時為\(7\)),然后矩乘轉移,復雜度大概就是\(O(nm7^3\log m+nm\log nm)\)。
6300. 「CodePlus 2018 3 月賽」博弈論與概率統計
考慮在一張網格圖上,從\((0,0)\)出發走到\((n,m)\),贏一局就向右走一格,輸一局就向上走一格。可以發現一種方案的最終收益至於這條路線中\(y-x\)的最大值有關,當\(n\ge m\)時答案等於\(n-m+\frac{\sum_{i=0}^{m-1}\binom{n+m}{i}}{\binom{n+m}{m}}\),否則答案等於\(\frac{\sum_{i=m+1}^{n+m}\binom{n+m}{i}}{\binom{n+m}{m}}\)。
所以問題在於怎么求\(\sum_{i=0}^m\binom{n}{i}\),即組合數前綴和。
設\(f_{n,m}=\sum_{i=0}^m\binom ni\),首先由\(f_{n,m}\)可以很容易知道\(與f_{n,m-1}與\)\(f_{n,m+1}\)。然后我們有:\(f_{n+1,m}=\sum_{i=0}^m\binom{n+1}{i}=\sum_{i=0}^m\binom{n}{i}+\binom{n}{i-1}=2f_{n,m}-\binom{n}{m}\)。
於是四個方向移動都可以\(O(1)\)實現,直接莫隊即可做到\(O(n\sqrt n+T\sqrt n)\)。
6338. 「SDWC2018 Day2」優秀
\(dp\)狀態記錄\(f_{i,j,k,l}\)表示加入了\(1-i\)共加了\(j\)個數,尚未滿足相鄰相差為\(1\)的數有\(k\)個(且這\(k\)必須都是\(i-1\)),排列的方案數為\(l\)的方案數,其中\(l\)的上界為\(k\)。
轉移時枚舉當前數加多少個:至少\(k\)個,且若加\(x\)個相當於把\(x\)個球放入\(k\)個盒子里且每個盒子至少一個球的方案數,即\(\binom{x-1}{k-1}\)。
復雜度看上去是\(O(n^5)\)的但是不滿所以跑得很快,可能可以分析得到更低的復雜度。
6339. 「SDWC2018 Day2」線段
很顯然可以對線段的\(2n\)個端點建立拓撲關系,然后就是要求最小字典序標號。
正確的姿勢是倒着做,即反向建拓撲圖,每次給入度為\(0\)的編號最大的點安排最大的標號。
6354. 「CodePlus 2018 4 月賽」最短路
異或操作只需要每一位連一條出邊就行了,總邊數\(O(n\log n+m)\)。
6401. 字符串
求出每個本質不同串的最長合法長度\(val_u\),答案就是\(\sum\max(0,\min(len_u,val_u)-len_{fa_u})\)。
6494. LJJ 的字符串
枚舉\(i,j\)的差,類似NOI2016優秀的拆分那樣可以連續一段的\(i,j\)一起計算貢獻。不知道發生了什么反正我寫的就是一個四階差分。
