一句話題解2


目錄


7026. 2021.03.26【2021省賽模擬】序列

KD-tree板題。直接上就過了。時間\(O(n\sqrt n)\)

也可以莫隊,由於修改不滿足交換律,所以需要額外用個線段樹來維護。時間\(O(n\sqrt n\lg n)\)。跑得比kd-tree快?


7027. 2021.03.26【2021省賽模擬】a

暴力做法:枚舉\(x\mod m=r\)。然后相當於有些位置已經被固定選什么,大概要求\(\prod(1+x^{2^i})\mod(x^m-1)\)的某一項。時間\(O(nm^2)\)

\(2^k\mod m\)相同的分在一起,排個序,那么相當於求序列上的三段的卷積,再卷起來。實際上兩個分界點是關於中點對稱的,所以可以維護中間那段,前后兩段卷積,得到兩個多項式之后可以\(O(m)\)查單點。時間\(O(m^2)\)

zys的高級做法:把第\(k\)為0變1,和1變0視作一個“操作”,將其丟入數組中,排序。排序之后分成對稱的兩邊。考慮原先的問題,現在枚舉某操作\(i\),表示把\(i\)改變之后這個數會被\(m\)整除。為了不算重,它應該是第一個操作。所以前面和它數值一樣的操作都被固定了。又由於左右對稱,只需要前面一段和中點前面一段卷起來即可。

\(m\)為偶數時,設\(m=2^kq\)。有兩種情況:最小的\(k\)位中只有一個\(1\),此時\(k\)位后面的整數截出來被\(m\)整除;這\(k\)位中沒有\(1\),把\(q\)替換\(m\)\(n-k\)替換\(n\),再做奇數的方法。


7028. 2021.03.26【2021省賽模擬】旅行

明明做過又不會做

枚舉第\(k\)大邊權\(lim\),把所有邊的邊權改為\(\max(x-lim,0)\),最終答案加上\(k*lim\)

稱長度大於等於\(lim\)的為大邊。如果走了不足\(k\)條大邊的情況,相當於要用\(lim\)將其補到有\(k\)條,因為此時前\(k\)大小於\(lim\),這一定會比實際情況劣。

於是如果真實最短路第\(k\)大為\(lim\),確實可以算到;否則,也不可能占便宜。


7032. 2021.03.28【2021省賽模擬】制作美食

每個\(x\)連向\([1,a_x]\)\(b_y\)最大的\(y\)(如果\(b_y\ge x\),否則這個點孤立)。只連這些邊,然后計算連通塊個數即可。

正確性:不妨把連出去的邊看成有向邊。發現大於等於\(2\)的連通塊(只考慮了所有邊的時候)中,一定存在兩個點\(x,y\)滿足\((x,y),(y,x)\)都連邊。我們這樣建圖的時候,手玩一下發現它不會形成除了\(x,y\)之外的環。於是如果去掉孤立點,\(x,y\)互相連接的個數就等於連通塊數,且這個\(x,y\)所在的連通塊的點集和真實的點集一樣。


7033. 2021.03.28【2021省賽模擬】超命運樹

判定條件:\(f(S)=1\),當且僅當\(S\)排序后相鄰的數\(S_i,S_{i+1}\)滿足\(\min_{i=S_i}^{S_{i+1}}P_i\)不重復。

考慮\(len(S)=len(T)\)時,\(S\)的條件。經過一堆分類討論可以得出。然后設\(dp_{i,0/1/2}\)表示\(T\)中最后一個數在\(i\)\(i\)不作為\(min\),作為\(min\),將要作為\(min\)。再經過若干分類討論得到\(O(n^2)\)做法。然后顯然可以用笛卡爾樹將其優化成\(O(n)\)

好像如果一開始就建出笛卡爾樹,可以更加清楚地看見它的判定條件(在笛卡爾樹上的意義)。


7034. 2021.03.28【2021省賽模擬】道路的眼淚

顯然先建出同構樹。第一問直接算每個點作為LCA的貢獻,第二問可以寫個樹形DP。第三問發現異或后的點集差分一下就是枚舉的集合,一一對應,所以直接組合數計算。都可以做到\(O(n)\)


ARC116

A:根據分解后\(2\)的次數判斷。

B:排序之后直接算。

C:只考慮\(A_{i}\neq A_{i-1}\)怎么做,算出之后插空。枚舉最后一個,設\(f_{i,j}\)表示最后一個是\(i\),長度為\(j\)的方案數。

D:相當於異或和加和等於\(M\)。相當於對每一位枚舉\(x_i,c_i\),要求\(\sum c_i2^i+\sum (2x_i+c_i)2^i\)。令\(t_i=x_i+c_i\),枚舉\(t_i\),要乘一些系數,然后變成了個背包問題。

E:二分+貪心。貪心的時候記\(f_i\)表示子樹中沒有被覆蓋的最遠點到\(i\)的距離,\(g_i\)表示子樹中最近的起始點到\(i\)的距離,貪心決策。---


6085. 【GDOI2019模擬2019.3.26】要換換名字

可以對每個字符串和它的子序列連邊,然后跑二分圖匹配。

只需要連至多\(n\)條邊,根據Hall定理。


6086. 【GDOI2019模擬2019.3.26】動態半平面交

顯然把每個\(p^k\)先拆出來。只需要處理有效的,估計一下大概是\(n+1000+\)

考慮維護個主席樹,時間軸是dfn,下標是深度。\(\frac{query(out_i)}{query(in_i-1)}\)可以詢問一個子樹中,某深度區間的貢獻。

再用個支持合並的線段樹,存每個\(p^k\)出現的最淺深度。線段樹合並到葉子的時候,在主席樹中把深度大的那個貢獻刪去。

時間\(O(n\lg n\lg V)\),空間\(O(n\lg^2 n)\)。(粗略)

(不過由於它可能會出一些\(2^{23}\)之類的點,使得空間好像變成了\(O(n\lg n\lg V)\)。如果把\(p^k\)\(p\)相同的放在一起,\(p\)不同的順序排列,這樣似乎就卡不掉了,因為對於一個節點它有的\(p^k\)比較多的時候,線段樹節點的共用部分會很多,所以還是把空間算成\(O(n\lg^2 n)\)吧……)


6087. 【GDOI2019模擬2019.3.26】獲取名額(口胡)

差個簡單優化想出來了啊。

如果\(1-\frac{a_i}{x}\)比較小,那么乘幾次精度就乘沒了。所以先暴力乘小於某個閾值的幾個\(1-\frac{a_i}{x}\)

對於其它的,考慮lnexp。展開\(\ln (1-\frac{a_i}{x})\),枚舉若干項。於是就是維護\(a_i\)的多少次方和。加起來之后\(exp\)

直接做精度誤差極大。但如果一開始把\(a_i\)變成\(\frac{a_i}{\max a}\),那就變成了個小於\(1\)的數,就不會爆炸增長了。

適當調閾值就可以AC了吧。時間大概\(O(n\lg^2 n)\)


7035. 2021.03.30【2021省賽模擬】神奇紙牌

每個數字有\(2^4\)種狀態,用\(2^{2^4}\)枚舉每個狀態是否出現過,然后組合數計算。

也可以寫出個DP,DP中記下連通性,壓狀態之后矩陣乘法。

zys神仙做法:可以感受到答案是\(\sum a_i i^n\)的,解方程算出系數即可。


7036. 2021.03.30【2021省賽模擬】凌亂平衡樹

首先可以維護出不合並時候的深度和。直接維護\(siz\),然后對答案直接進行加減。

考慮合並的時候的增量。提取出左樹的右鏈和右樹的左鏈,設各自子樹大小為\(A_i,B_i\)(從下往上)。如果\(A_n\ge B_m\),答案加\(B_m\)並且\(m\)減一;否則答案加\(A_n\)並且\(n\)減一。

每次修改的時候,只會對這個序列有\(O(1)\)的修改。問題是怎么維護這個東西。

為方便差分一下,設為\(a,b\)。於是\(b_i\)的貢獻為\(b_i\sum[A_j\ge B_i]\)\(a_i\)同理。維護個權值線段樹,把\(b_i\)掛在\(B_i\)位置上,對於節點維護\(a\)\(b\)的和以及出現次數,和答案,合並的時候能夠維護答案。

\(A_i\)視作\(2A_i\)\(B_i\)視作\(2B_i-1\),就不用討論它們相等的情況了。

時間\(O(n\lg n)\)


7037. 2021.03.30【2021省賽模擬】打掃笛卡爾

大發揮失常:虛空調試+看錯題意+已經推出正解還在推更復雜的東西。

一條邊被走的概率是\(\frac{1}{2}\),所以一棵固定的樹的答案是\(\sum (\frac{1}{2})^{deg_x}(deg_x+1)\)

\(f_n\)表示\(\sum (\frac{1}{2})^{deg_x}(deg_x+1)\)的期望,\(g_n\)表示\(\sum (\frac{1}{2})^{deg_x}\)的期望。列出來化簡得到:

\[g_n=1+\frac{1}{n}\sum_{i=0}^{n-1} g_i\\ f_n=g_n+\frac{1}{n}\sum_{i=0}^{n-1} f_i \]

前綴和,有逆元的時候可以\(O(n)\)做。\(g\)是調和級數,\(G(x)=-\frac{\ln(1-x)}{1-x}\)\(F(x)\)也可以推可是解錯了微分方程。

由於要求\(n!f_n\),多瞪兩眼就可以得到不用逆元的做法。


7038. 2021.04.01【2021省賽模擬】異或

原題。異或最小值是排序后相鄰異或值的最小值。所以排序之后DP,設\(f_i\)表示最后一個選\(i\)的方案。用個Trie輔助轉移。


7039. 2021.04.01【2021省賽模擬】計數

原題。稍微推一下生成函數,最后推出個\(\frac{1}{1-(ax+bx^k)}[x^n]\)這樣的東西,展開,可以在\(O(\frac{n}{k})\)時間內搞出來,最后時間是\(O(n\ln n)\)


2021.04.01【2021省賽模擬】優化

\(f(x)\)表示\(k=x\)時的答案,\(f(x)\)為凸函數。

用個線段樹來存一個區間內\(f(x)\),合並的時候可以閔科夫斯基和,時間\(O(n\lg n)\)

詢問的時候,外面套一層wqs二分,對於區間對應的節點,每個分別二分得到當前斜率下的最優解。時間\(O(n\lg^3 n)\)

其實也可以整體二分。於是每個節點中二分的范圍在分治的過程中會減小,對於一個節點,在每一層中,二分的范圍之和都是這個它的長度。於是所有節點在所有層中的二分范圍長度和是\(O(n\lg n\lg V)\)。實際上不用二分,暴力掃,也就做到了\(O(n\lg n\lg V)\)的時間。


LOJ3101. 「JSOI2019」精准預測(口胡)

設點\((x,i)\)表示\(i\)時刻\(x\)的生死(生\(0\)\(1\)),於是有:\(c_{x,i}=1 \to c_{x,i+1}=1,c_{x,i}=0\to c_{x,i-1}=0\)

對於邊\((u,v,t,0)\),有\(c_{u,t}=1\to c_{v,t+1}=1,c_{u,t}=0\to c_{v,t}=1\)

把每個點的關鍵時間提取出來,一共\(O(n)\)個點,two-sat建圖。

問題相當於:對於每個\((x,T)=0\),詢問:它是否能到達\((x,T)=1\);如果不能,詢問能到達多少個\((y,T)=0\)

於是就是個bitset的事了。


6149. 【GDOI2019Day1模擬2019.4.28】盜夢空間

建虛樹,求出起點到每個點的最小距離。在虛樹的相鄰兩個點之間找到分界點,然后分別計算;另外還有一些子樹,用set除去已經在虛樹中的子樹,然后計算即可。

現在問題是:詢問一條祖先后代鏈上,掛在這個鏈上的子樹的信息。愚蠢的做法是直接樹剖,這樣要寫線段樹而且要根據輕重兒子分類討論,時間\(O(n\lg^2 n)\)。但實際上也可以倍增,對於每個點記一下其兄弟的信息,時間\(O(n\lg n)\)


6150. 【GDOI2019Day1模擬2019.4.28】愛樂之城

這道題教導我們如何划分子問題,而不是將一些強行組合的式子從頭展開到尾。

\(A(n)=\sum_{i=1}^n\sum_{j=1}^n[i\perp j]\mu(i)\mu(j)=\sum i^2\phi(i)\)\(B(n)=\sum_{i=1}^n\sum_{j=1}^n\mu(ij)=\sum_{d=1}^n\mu(d)(\sum_{d|i,i\le n}\mu(i))^2\)

(推導\(A(n)\)的時候用到了\(\sum_{j}[i\perp j]j=\frac{\phi(i)+[i=1]}{2}\)

都可以\(O(n\ln n)\)預處理。(\(B\)要差分再前綴和)

題目要求\(\sum_{T}B(\gcd(T))\prod A(a_i)\)。按照套路搞:

\[\sum_{d}B(d)\sum [\gcd(T)=d]\prod A(a_i)\\ =\sum_T\sum_{d}B(d)\sum_{d|a_i}\sum_{de|a_i}\mu(e)\prod A(a_i)\\ =\sum_T\sum_{p|a_i}(\sum_{d|p}B(d)\mu(\frac{p}{d}))\prod A(a_i) \]

左半部分先預處理。現在可以把式子看成\(\sum C(p)G(p)\)。現在考慮維護\(G(p)\)。當加入值\(v\)時,對於\(v\)的每個因數\(u\),於是\(G(p)\leftarrow G(p)(1+A(v))+A(v)\)。由於保證了每個值不重復,所以總時間\(O(n\ln n)\)


6151. 【GDOI2019Day1模擬2019.4.28】星際穿越

容斥,欽定一些分界點合並,合並一次容斥系數是\(-1\)。於是列出生成函數\(F(x)=\sum_{i\ge 1}(-1)^{i-1}\frac{x^{Ki}}{(Ki)!^r}\)。另外最后一段有些區別,設為\(G(x)\)

於是答案即\(\frac{G(x)}{1-F(x)}[x^n](n!)^r\)。直接多項式求逆即可。


3056. 「HNOI2019」多邊形

顯然終止狀態是所有點連向\(n\)。如果沒有到達終止態,每次一定可以找到\(a<b<c<n\)組成個四邊形,弦為\((a,c)\),然后把它換成\((b,n)\)。所以操作次數是\(n-3-([2,n-1]中和n直接相連的點數)\)

把和與\(n\)相連的邊拉出,然后分成子問題。這樣可以得到一個樹形結構。方案數是\(\prod_x\frac{(sz_x-1)!}{\prod_{y\in son(x)} sz_y!}\)。可以化簡。

考慮一次操作對於樹是什么影響。畫一下可以發現類似於旋轉,大概來說,原本\(x\to A,x\to B,y\to x,y\to C\)變成\(y\to A,y\to x,x\to B,x\to C\)\(sz\)的變化是\(O(1)\)的,如果建出樹並且知道對應編號就可以求。

一條邊對應節點是,這個節點的狀態中,這條邊對着\(n\)。建樹的時候需要快速查\(l,r\)連向的公共點。愚蠢的做法是用bitset,MLE;聰明的做法是直接用set\(l\)連出的最大點和\(r\)連出的最小點就是其公共點。記得建樹遞歸的時候一些顯然對后面沒有用的邊要刪去。


7041. 2021.04.03【2021省賽模擬】Alice 和 Bob 雙在玩游戲

如果圖中只有一個棋子,容易得到誰勝誰負。

有多個棋子的時候,由於棋子之間沒有互相依賴,可以分開搞。預處理\(f_i\)表示如果有個從\(i\)出發的棋子,誰會勝,以及可以續多少條命。如果有棋子\(f_i\)的和大於\(0\),則A勝。

然后就是個背包的事情。


7042. 2021.04.03【2021省賽模擬】時代的眼淚·SP(口胡)

考慮對一個塊的整體修改,把塊中的點暴力跳,跳過的標記,如果跳到了則刪去這個點。於是一個塊只會跳\(O(n)\)次。

於是可以搞出個\(O(n\sqrt n)\)的算法:對於每個點,維護一下它向上跳了多少格,於是可以\(O(1)\)單點當前的位置。修改時,對於整塊,塊中沒有刪去的點暴力跳,對於散塊,如果被刪去了,記一下之前刪去的時間,於是可以通過求k級祖先迅速跳到當前位置,並且重新加入。查詢時,整塊直接查,散塊要查k級祖先。

維護哪些點沒有被刪除可以用鏈表。加入直接在后面加。

原題的做法:對於一棵樹,每次把所有葉子節點刪掉,如果刪了\(O(T)\)次,剩下的葉子結點個數不超過\(O(\frac{n}{T})\)個(稱這些點為關鍵點)。於是每個點前\(O(T)\)步暴力跳。每個關鍵點維護個線段樹,下標為序列位置,值為深度。修改時,枚舉每個關鍵點,區間改,區間查最小值。時間\(O(n\sqrt {n\lg n})\)


UOJ607. 【UR #20】跳蚤電話

題目要求加點的過程中保持一棵虛樹的形態。也就是說,設\(rk_i\)表示\(i\)出現的時間。有\(\max(rk_u,rk_v)\ge rk_{LCA(u,v)}\)

把一個點的所有子樹中的點出現時間排序,於是這個點能夠插入的地方在\([1,sec]\)之間,其中\(sec\)表示第一個所屬子樹和\(1\)不同的位置。

組合數算一下就好。


7043. 2021.04.03【2021省賽模擬】鈎子·Plus

首先可以給每個位置分配一個\((0,1)\)的隨機數\(p_i\),按照\(p_i\)從小往大,如果兩邊沒有被標記,則標記當前點。

假設下標為\((-\infty,+\infty)\),如果最終\(0\)被標記了,當且僅當:對於\(l,r\)滿足\(p_{l-1}>p_{l}<\dots<p_{-2}<p_{-1}<p_0>p_1>p_2>\dots>p_r<p_{r+1}\),有\(2|l,2|r\)

\(p_0=x\)。可以算出一邊概率為\(e^{-x}\),兩邊合起來概率為\(e^{-2x}\)。然后可以積分。

至於為什么只需要考慮\(0\),zys說題解很不嚴謹並將其證了一遍。

現在考慮搞整個序列。設\(dp_{i,t1,t2,t2}(x)\)表示匹配了\((-\infty,i]\)\(p_i=x\)\(i\)左邊的極長遞減序列長度奇偶性為\(t1\)\(t2\)\(t3\)分別表示右邊如果接一個極長的遞減序列奇偶性為什么時,是否可以讓\((-\infty,i)\)和序列匹配。此時的概率密度函數。

轉移的時候大力積分。


7044. 2021.04.05【2021省賽模擬】悄悄話

\(f_i\)表示\(i\)為最后一個的答案。轉移時找到\(j\)滿足\(s_j\)\(s_i\)的子串。

維護數據結構,修改時\(f_i\)掛在\(s_i\)上,查詢時查\(s_i\)的所有子串上信息的最大值。可以用AC自動機或后綴自動機做,查詢的時候枚舉\(s_i\)前綴,跳fail鏈即可。配合線段樹搞。

時間\(O(\sum |s_i| \sum |s_i|)\)


7045. 2021.04.05【2021省賽模擬】數學考試

和三次函數沒有任何關系。

網絡流建圖。對於每個變量,從\(S\)\(T\)拉一條鏈,割鏈上哪條邊就代表選擇哪些。

對於限制,就在兩條鏈之間橫叉邊來限制。如果不滿足,那么一定還有邊可以流。


7046. 2021.04.05【2021省賽模擬】迷路深層

怒敲4k最終它假了。

暴力就是搞個生成樹,對於非樹邊,把它所在環丟進線性基里。詢問的時候,首先必須選兩點間任意一條路徑,然后再用線性基得到最優解。

對於區間,可以用回滾莫隊+可撤銷並查集來搞。每個連通塊維護個線性基。並查集中還需要維護當前點到getfa之間的異或和,詢問兩個點之間的異或和可以直接用它們的這個東西異或起來。

要線性基合並。右邊的部分勢能分析可以得到時間是\(O(m\sqrt m \lg V)\)(對於某個數,在合並的時候,可能最高位會減,直到對應位為空插進去,或者最高位減到0。所以一個數的勢能是\(\lg V\)),左邊的部分不能勢能分析時間是\(O(m\sqrt m\lg^2 V)\)

題解的分析是假的。


LOJ3110. 「SDOI2019」快速查詢(口胡)

看到洛谷上顯示提高+省選-我人傻了

其實這\(t*q\)的操作可以看成方便讀入\(10^7\)組詢問。以操作\(4\)分組。現在相當於有個初始數組\(a_i\),每次乘或加,記進行了\(x\to px+q\)這樣的操作,遇到單點賦值的時候,令\(pa_i+q=v\),解出\(a_i\),修改\(a_i\)以及總和即可。單點查答案就是\(pa_i+q\)

時間是\(O(q\lg V+qt)\)。其中\(\lg V\)是求逆元。


LOJ3111. 「SDOI2019」染色(口胡)

套路題。把相鄰的有值的兩列之間作為一個單位計算。設\(f_{i,c}\)表示處理完前\(i\)個單位,最后一個單位中的空位顏色為\(c\)的方案數。預處理\(g_{i,S}\)表示一個長度為\(i\)的單位內的貢獻,\(S\)表示\((1,1),(2,1),(1,i),(2,i)\)四個位置的關系(哪些相等)。狀態不會很多。於是得到了\(O(nc)\)的做法。剩下4分不要也罷。

據說剩下4分可以用線段樹或者用SDOI2019D1T1的方法來搞。


LOJ3112. 「SDOI2019」世界地圖(口胡)

求出前綴和后綴的MST,然后合並。求\(pre_{i}\)需要\(pre_{i-1}\)和第\(i\)列合並。合並的時候,兩塊中的最左邊和最右邊(不只是左塊的右邊和右塊的左邊,因為最終還要處理前綴和后綴合並)設為關鍵點,對關鍵點建虛樹,虛樹上每條邊中取最大邊。除了這些邊,其它的邊合並之后都不會邊。於是對這些邊和新加入的邊跑MST,跑完之后維護虛樹即可。

一次合並\(O(n\lg n)\),總時間\(O(mn\lg n)\)


7047. 2021.04.07【2021省賽模擬】染色

看對斜線染色不爽,把它推一下變成個平行四邊形,於是就是對行和列染色。欽定選擇哪些行,然后對列染色,要求不存在一行本來沒有選,但是穿過它的列全部被選了。設\(f_{i,j}\)表示已經考慮了前\(i\)行,第\(i\)行最后留白的列為\(j\)\(j\)后面的必須選。枚舉下一個不選的行\(k\),根據\(j,i+m,1+k\)的關系分類討論,轉移到\(f_{k,t}\)\(t\)是枚舉的最后一個留白的列(可能\(t=j\)),直接寫\(O(n^4)\),容易優化至\(O(n^2)\)


7048. 2021.04.07【2021省賽模擬】在淚水化為雪花之前

轉化題意就是要決定\(e_i\),使得\([x^c]\prod\frac{1}{(1-p^ix)^{e_i}}\)為給定的多項式。其中\(e_0\)可以小於\(0\),其它非負。

設最大的\(e_i\neq 0\)\(i\)\(m\)。考慮最終搞出的\(p\)次數的范圍,顯然最大是\(mc\)。於是要求\(n=mc\)。由於只有\(\frac{1}{(1-p^mx)^{e_m}}\)\([x^{mc}]\)有影響,所以\(e_m\)是可以算出來的(\(\binom{c+e_m-1}{e_m-1}=a_{mc}\),枚舉算出,不會很多,題解說模數\(998244353\)時打表發現\(k\)相同的\(\binom{x}{k}\)中相等的至多有\(3\)個)。接下來考慮\(a_{mc-1}\)等於什么,發現它之和\(e_m\)\(e_{m-1}\)有關,所以可以求出\(e_{m-1}\),依次類推可以推出更前面的。

推的過程,維護個\(F_k(p,x)=\prod_{i\ge k}\frac{1}{(1-p^ix)^{e_i}}\)。由於\(a_{m(c-1)+i}=F_{k+1}(p,x)[p^{m(c-1)+i}x^{c}]+\binom{c-1+e_m-1}{e_m-1}\binom{1+e_i-1}{e_i-1}\),於是可以解出\(e_i\)

時間是\(O(mcn*c)=O(n^2c)\)

\(i=0\)時,需要討論\(e_i\)的正負。如果非負照樣計算,如果為負,也能用其它方法計算。我的方法是考慮\(a_0=(1-x)^{-e_0}[x^c]\),如果\(a_0\)不為\(0\),此時候選的\(e_0\)都做一遍;如果\(a_0\)\(0\),於是\(-e_0<c\)\(-e_0\)的狀態可以由\(-e_0-1\)推過來。這部分耗時\(O(nc^2)\)


7049. 2021.04.07【2021省賽模擬】生命游戲

跟GDKOI那題好像啊況且出題人知道。

首先分開奇偶,給它轉45度,於是可以視作一個矩形,每次往右往上擴張一格。求出每個時間點的面積並,然后前綴和就是答案。

把數值視作\(c\)\(c+T\)的形式。處理大小關系不變的\(O(n^2)\)個區間,每個區間內時間點的面積並是個二次函數,掃描線處理之。得到這個分段函數之后給它前綴和即可。

時間\(O(n^3\lg n)\)


7051. 2021.04.08【2021省賽】模擬 B 數據結構

考場寫KDT,常數大得只有暴力分。

可以視作一次詢問兩個序列的前綴(或后綴),取出兩個數滿足\(y\)的限制,要求權值和最大。朴素莫隊可以做到\(O(q\sqrt n\lg n)\),二次離線可以做到\(O(q\sqrt n)\)。也可以直接分塊做到\(O(q\sqrt n)\)(還是\(O(n\sqrt q)\)?)

正解要用到一次同時詢問前綴和后綴。首先對\(y\)分治,現在處理左邊的\(r\)和右邊的\(b\)。考慮到一個詢問,是詢問\(((-\infty,L_i),(-\infty,R_i))\)\(((L_i,+\infty),(R_i,\infty))\)。可以發現兩個序列中\((-\infty,\infty)\)的最大值都會出現,並且如果出現了那么會選。於是取\(r\)的最大值和\(b\)的所有值,和\(b\)的最大值和\(r\)的所有值作為有效的點對。這樣的點對總共有\(O(n\lg n)\)個。然后再整個二維數點就可以得到\(O(n\lg^2 n)\)的做法。


AGC053

A:首先下界\(k=\min(|a_i-a_{i+1}|)\)。然后將均分成\(k\)個序列,對於\(a_i\),序列編號(從\(1\)開始)小於等於\(a_i\mod k\)的就取\(\lfloor\frac{a_i}{k}\rfloor+1\),否則取\(\lfloor\frac{a_i}{k}\rfloor\)。可以證明這樣構造一定滿足條件。

B:合法的答案,當且僅當:從中間往兩邊,對稱綁在一起。如果遇到\(01,10\)就不變,遇到\(00\)就加一,遇到\(11\)就減一,要求最終為\(0\)並且前綴和大於等於\(0\)。於是可以看做兩個序列\(a_i,b_i\),欽定\(a_i>b_i\),一開始全選\(a_i\)。可以選擇\(i<j\),本來選\(a_i\),調整為選\(b_j\)。用個堆從后往前掃,貪心看看當前的\(a_i\)是否可以替換成后面的。

C:假設最大數所在數組為\(a\),另一個為\(b\)。考慮對於\(b_i\),如果\(b_i>\max_{k=1}^i a_k\),則它應該要被后面的消去,那么就在后面找到第一個大於它的\(a_j\),可以證明找更后面的不會更優。於是答案為:對於\(b_i\),找到最小的\(j\)滿足\(a_j>b_i\)\(\max(j-i,0)\)的最大值就是答案。考慮計算\(p(d)\)表示答案不超過\(d\)的概率,於是對於任意\(i\),存在\(j\le d+i,a_j>b_i\)。不妨把\(i\)從從小往大一次考慮,發現這相當於對於任意\(i\)\(b_i\le \max(\max_{j=1}^{i+d} a_j ,\max_{j=1}^i b_j)\)。從后往前確定\(b_i\),按照這樣的順序確定\(b_i\)的時候更后面的\(b_i\)沒有影響。於是\(p(d)=2\prod\frac{i+\min(i+d,n)-1}{i+\min(i+d,n)}\)。容易\(O(n)\)算出所有\(p(d)\)


聯合省選2021

D1T1:枚舉\(max\),求出最大的\(min\)。分類討論分析,最終可以做到除排序之外\(O(n)\)

D1T2:隨便構造出一組解\(a\)。可以發現對一行(或列)加\(x,-x,x,-x,\dots\)仍然是一組解。令最終的解\(a_{i,j}\leftarrow a_{i,j}+(-1)^{i+j}x_i-(-1)^{i+j}y_j\)。可以轉化成差分約束問題,用Bellman-Ford跑(方便判負環)就好了。

D1T3:大把\(O(nm)\)做法。題目相當於對於每個\(u,v\),求從\(u\)\(v\)和從\(v\)\(u\)不經過小於\(u\)的點,路徑權值和最小值最大是多少。用桶優化dijkstra是\(O(nm)\),但是會TLE。其實可以動態加邊,加邊后看新增能到達哪些點,BFS一下,這樣也是\(O(nm)\),常數較小。也有floyed的做法,枚舉中轉點\(k\)從大往小枚舉,算完一層之后統計\(u=k\)的答案。這樣可以避免建反圖,並且\(i>k,j>k\)的轉移可以不需要(解釋:一條路徑轉移的過程,可以視作一個折線圖,橫坐標為路徑上第幾個,縱坐標為節點編號。每次把縱坐標最大的點刪掉,把相鄰的兩個點連起來。由於這題限制中起點或終點肯定有一個是全局最小值,所以每次操作中,當前點左右兩邊都小於它),加上這個小優化之后可以卡過去。

D2T1:分成\(u\to lca\)\(lca\to v\)計算。對於某個點,如果它在序列中,記下顏色為序列上后繼的最近祖先。於是可以倍增快速查\(u\to lca\)搞了多少位。對於\(lca\to v\),可以二分最后一位,類似搞搞。於是得到了\(O(n\lg^2m)\)的做法。如果換成點分治,就可以省掉倍增,\(u\to rt\)可以\(O(1)\)做,\(rt\to v\)要二分然后\(O(1)\)查。於是時間是\(O(n\lg m)\)

D2T2:不動腦子可以寫出一個DP。注意到並不需要記最后一個具體是多少,只需要差分一下,當前這個加多少,后面的一並加多少。於是就可以過了。


牛客挑戰賽049

A:略

B:設\(s(n)\)表示各位數的和。先求出\(\sum s(i)-s(i-1)\),再減去\(\sum (s(i)-s(i-1))[s(i)-s(i-1)<0]\)。后者存在當且僅當\(i\mod 10=0\),進而可以列出式子快速計算。

C:把操作掛在節點上,從大往小枚舉節點編號,每次找到祖先最近的操作。用並查集維護。

D:回文串長度不超過\(20\),所以可以枚舉回文串,然后直接判定是否在\(A\)串中。

E:先手要最小化\(A邊-B邊\)。可以把邊攤到點上,即邊的端點加\(0.5\),如果\(A\)選就加,\(B\)選就減。顯然對於最終的方案,異色連沒有共線,同色連貢獻為\(\pm 1\)

F:找出所有的環丟到線性基中,詢問\((u,v)\)時先異或上dfs樹上路徑的權值和,丟到線性基里跑。詢問權值和要\(O(1)\)LCA,由於線性基固定所以可以分兩半做,也是\(O(1)\)。時間是\(O(n\lg n+Q)\)的,但是求LCA尋址常數太大所以過不去。正解:設有兩個點\(x,y\),從任意點出發,走到\(x\)回來,再走到\(y\)回來,於是答案恰好異或上\(a_x \ xor\ a_y\)。並且由於是二分圖,詢問兩點間的路徑長度是固定的。於是答案有兩種,就是選擇奇數個點或選擇偶數個點。有個小trick:安排一位表示奇偶性(設為\(2^w\),並且\(w\)是最高位),詢問奇數的時候丟\(0\)進去,詢問偶數的時候丟\(2^k\)進去,最后答案都異或上\(2^k\)

G:題目求的是仙人掌上兩點間最小割。對於一個環,最小邊一定會被割。於是把最小邊去掉,其權值加到其它邊上。最后形成一棵樹。把每位拆開,利用重構樹計算答案即可。


ARC117

A:對大的那邊,\(1,2,3,\dots\)這樣構造。另一邊除最后一個也這樣。

B:排序后差分,每次相當於選一個大於0的數減一。

C:把三種顏色看成\(0,1,2\)。對\(x,y\)操作變成\((-x-y)\mod 3\)。然后組合數計算。

D:可以做到\(2n-1-直徑長度\)。以直徑端點為根搞個歐拉序,要求最后一個被第一次遍歷的點是直徑的另一個端點,把每個點第一次出現的時間作為答案。接下來證明這同時也是答案的下界:設最終權值為\(w_i\),對於排序后相鄰的\(w_i\)(即\(w_u<w_v\)不存在\(w_u<w_x<w_v\)),那么有\(w_v-w_u\ge dis(u,v)\)。只考慮相鄰的限制,那么相當於:決定一個排列\(p\),最小化\(1+\sum dis(p_i,p_{i+1})\)。也就是遍歷整棵樹的最小時間,按照歐拉序跑最優,此時下界是\(1+2n-2-直徑長度\)

E:考慮畫出前綴和的圖像,用個平行於x軸的直線從下往上掃,維護掃描線和折線的交點。假設最低點縱坐標為\(0\)。設\(f_{i,j,k,c,0/1}\)表示掃到縱坐標\(i\),已經掃過的點數為\(j\),已經掃過的點形成了\(k\)段,題目中問的那個段的個數是\(c\)嗎,開頭和結尾是否固定,此時的方案數。轉移時枚舉\(x\)表示合並相鄰的段\(k\)次,枚舉\(y\)表示合並段之后在空白中插入了\(y\)段。於是就可以得到\(O(n^7)\)的做法。可以發現轉移之和\(x-y\)有關,所以可以把\(x-y\)相同的一起枚舉,用個前綴和計算一段合法\(x\)的區間的貢獻,就有\(O(n^6)\)。實際上枚舉\(i\)是沒有必要的,安排其它的轉移順序,就有\(O(n^5)\)


計蒜客2021預賽第一場

A,B:略

C:設答案為從\((0,0)\)\((n,n)\)。對於一個三角形區域,某條路徑第一次經過位置是三角形的直角邊,即\((x,y)\)\((x+i,y)\)\((y,x+i)\),從這里開始不管怎么走前面連續\(len-i\)個格子會有貢獻。於是可以列出式子,列出式子之后可以前綴和優化。

D:顯然可以得到遞推式:\(f_{2n}=f_n,f_{2n+1}=f_n+f_{n+1}\)。考慮搞一棵樹,節點\(i\)權值\(w_i=(f_i,f_{i+1})\)。於是\(w_{2i}=(f_i,f_i+f_{i+1}),w_{2i+1}=(f_i+f_{i+1},f_{i+1})\)。答案求\(\max (w_{i,fi}+w_{i,se})\)。假設從\((x,y),x<y\)開始\(k\)滿層,因為是滿層所以可以欽定二元組順序,於是最優的是\((xF_{k},yF_{k+1})\),其中\(F\)為斐波拉契數。把詢問范圍拆成若干個滿二叉樹即可。全程高精度。


Codeforces Round #715 (Div. 1)

A:考慮對於兩個序列\(a,b\),可以構造出長度為\(4n-\min (cnt0_a,cnt0_b)\)。即拉出全為0的公共子序列,然后中間的填一下。於是找到\(a,b\)滿足\(cnt0_a\ge n,cnt0_b\ge n\)。如果找不到,那么存在\(a,b\)滿足\(cnt1_a>n,cnt1_b>n\),同樣構造。

B:可以發現合法的方案能夠視作划分成若干個區間,將這些區間中的順序反轉。算出方案數之后從前往后確定即可。方案數是2的冪次的形式,增長較快,按位確定的過程中不用二分當前位是什么。

D:如果只有一個輪換,可以欽定一個點\(x\),每次\(swap(p_x,p_{p_x})\),這樣一定能行。並且連出來的是以\(x\)為中心的菊花。如果有多個輪換,先找到一個\(x\)(滿足\(p_x\neq x\))作為根,對其它點極角排序。眾所周知如果\(x,y\)不在同個輪換,\(swap(p_x,p_y)\)之后就會在同個輪換。所以對極角排序后的相鄰點進行這樣的合並。(注意相鄰點的極角差要小於\(\pi\))合並完之后以\(x\)為中心連出個菊花即可。


7065. 【2021.4.24 NOI模擬】樟樹

給第一棵樹分塊,第二棵樹直接掃,類似於回滾莫隊地做。

找管轄點,一個點被它最近的作為管轄點的祖先所管轄。記\(len_x\)\(x\)子樹中,到\(x\)路徑上沒有管轄點的最遠點距離。如果\(len_x\ge B\)則將\(x\)變成管轄點。取\(B=O(\sqrt n)\)

所有葉子節點的\(B\)級祖先形成的樹的葉子個數為\(O(\frac{n}{B})\),於是所有葉子的\(B\)的倍數級祖先的集合大小為\(O(\frac{n}{B}+\frac{n}{B^2}+\dots)=O(\frac{n}{B})\)

(注意不要取\(\sqrt {maxdep}\),這樣可能不能保證塊個數)

用可回退並查集來維護連通性。時間\(O(n\sqrt n\lg n)\)


7066. 【2021.4.24 NOI模擬】ehzeux與圓周

AGC028D


7067. 【2021.4.24NOI模擬】對稱線性規划問題

現在構造一種方案,最終答案為總和一半。把\(i\)\(4n-1-i\)配對。把每行作為一個節點,\(i\)\(4n-1-i\)所在的兩行之間連邊。

於是形成了\(n\)個點\(2n\)條邊且每個點度數為\(4\)的無向圖,現在需要選擇一些邊,使得每個點恰好有兩條相鄰邊被選擇。

對於每個連通塊找歐拉回路,路徑上的邊奇偶分類。可以證明這樣一定合法。


Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2)

A:略。

B:每次找到最小值,其它的列找到最大值,刪掉。

C:考慮對角線從右上往左下掃過去,發現每次可以唯一地確定對角線上的數值。

D:O(n2k3)能過。其實最終一定是走一段\(\frac{k}{2}\)長的路徑再原路返回,因為如果走個環,可以選擇前半和后半中較小的。設\(f_{x,y,i}\)表示從\((x,y)\)出發走\(i\)步最短路程,不用記終點。轉移是\(O(1)\)的。

E:經過細致的分類討論,可以發現合法的序列是:1. 若干個P+若干個C。2. (P)+若干個C+PCPC...PC+若干個P(C)。前綴和搞一下可以發現這是個二維偏序。

F(口胡):

思考的時候似乎看錯了題意。我的想法:一個連通塊的level相當於從所有葉子結點出發跑最短路,樹中最大的\(dis\)(這里和題目已經偏了),也就是取兩個葉子\(u,v\),最小的\(\frac{dis(u,v)}{2}\)。考慮所有連通塊的level不超過\(lim\)的情況。於是可以DP,設\(g_x\)表示\(x\)子樹中\(x\)不選的方案數,\(h_x\)表示\(x\)子樹中\(x\)選並且保證\(x\)所在連通塊已經滿足條件的方案數,\(f_{x,l,0/1}\)表示\(x\)子樹中\(x\)選未保證\(x\)所在連通塊滿足條件,且距離\(x\)最大的葉子距離為\(l\),是否強制\(x\)為葉子節點的方案數(好像\(0/1\)可以去掉)。時間是\(O(n^3)\)

題解做法:考慮level不超過\(lim\)的情況。設沒有選的點為黑點,那么這等價於每個黑點畫個半徑為\(lim+1\)的圓,要求並覆蓋所有點。於是可以DP,如果子樹內存在未覆蓋的點,則記其最深深度;否則,記下可以向上延伸多少。注意並不需要同時記未覆蓋點的最深深度和向上延伸多少,因為如果它后來被覆蓋了,那么覆蓋它的那個點向上延伸肯定比這里記的多。


LOJ3048. 「十二省聯考 2019」異或粽子(口胡)

前綴和,建Trie,維護每個點和其它點異或第幾大在哪里。把這些第幾大丟進堆里,每次取最小的,然后找更大的點重新丟進堆里。可以直接用可持久化Trie,也可以直接用Trie,然后\(k\)變成\(2k\)。時間\(O(k\lg V)\)

有個和\(k\)無關的做法:先用\(O(n\lg V)\)的時間二分出第\(k\)大具體是什么,對於大於第\(k\)大的,枚舉一個值,要計算它異或上Trie中\(O(\lg V)\)個子樹中的值的和,相當於排序后序列中\(O(\lg V)\)個區間。分開每位計算,前綴和即可。時間\(O(n\lg^2V)\)


LOJ3049. 「十二省聯考 2019」字符串問題

建出Trie在上面連邊然后跑最長路。可以對反串建SAM從而建出后綴樹,然后把關鍵點在后綴樹上定位,不在后綴樹的整點上的點另外分配標號,建圖直接跑即可。時間\(O(n\lg n)\),這個\(O(\lg n)\)來自對點定位。

有個想法:直接建SAM,用SAM的轉移邊建圖。實現過之后發現這樣是假的,因為一個點代表長度在某區間內的互為后綴的串,如果從一個串(根據點和長度確定),往后跑到一個點,某個串對應點是那個點但長度小,這時候就不合法。


6152. 【GDOI2019Day2模擬2019.4.29】Endless

權值從小到大枚舉。找平方串套路:枚舉長度,設立觀測點,如果相鄰觀測點的LCP和LCS之和大於等於長度,則有平方串,這些平方串的開頭在連續的區間。

支持兩個區間合並,ST表+並查集即可。


7068. 【2021.4.28 NOI模擬】隔離

平面圖滿足\(C=F+V-E\),其中\(C\)是連通塊個數,\(V,E,F\)分別是點、邊、面(不包括最外面)。

算矩形框住了哪些點、邊、面,邊可以看做矩形,面可以預處理出來,也能看做矩形。然后做四維偏序,\(O(n\lg^3 n)\)

處理面的時候,把每個點的出邊極角排序,從某個點開始選一條邊開始跑,到下一個點找這條邊的后繼繼續跑,最終肯定能找到環。每條邊跑過就刪掉。這部分可以用map實現。還要判斷是否是最外面,求一遍有向面積,如果有效面積是負的那就是最外面,不算。

為什么不算最外面然后減一?因為並不確定最外面的坐標范圍是多少。


7069. 【2021.4.28 NOI模擬】匹配

構造\(\sum_{j\subseteq i} b_{j}=a_i\)。容易發現高斯消元之后斜對角線(同時也是每一行非0的數為\(b_i\)),求\(b\)用FWT即可。

模擬即可說明。考慮消到第\(i\)行,前面\(j\in[0,i-1]\)行都滿足\(M_{j,k}=[j\subseteq k]b_j\),由於第\(i\)行中\(M_{i,k}=\sum_{t\subseteq i\bigcap k}b_t\)。可以視作對於所有的\(t\subseteq i\)\(t\),有\(M_{i,k}+=[t\subseteq k]b_t\),剛好這部分的貢獻就是\(M_t\)。所以\(i\)肯定是和\(t\subset i\)\(t\)消元,消元之后就變成那樣。


7070. 【2021.4.28 NOI模擬】氪金手游

\(ans_i=\sum_k w_k[x^k]\sum_{l=1}^r\prod_{i=l}^r(1-p_i+p_ix)\)

點乘可以視作減法卷積乘\(x^0\)項。記\(W(x)=\sum w_kx^{-k}\)

考慮分治。設當前點為\(p\)\(H_p\)為區間外的點的影響(\((1-p_i+p_ix)\)后綴積的和)。

於是有\(H_{lc}=H_p,H_{rc}=H_pf_{lc}+Wg_{lc}\)。其中\(f\)表示區間內\((1-p_i+p_ix)\)的乘積,\(g\)表示區間內后綴積的和。

由於只需要求\([x^0]\),所以只需要保留\(O(r-l+1)\)項系數。

時間\(O(n\lg^2 n)\)


AGC045

A:考慮從后往前做,記\(F_i\)是個集合,表示做完了前\(i\)個,如果當前值為\(x\)后面能消到0,則在集合中。用線性基來維護。如果遇到了0,就加入線性基;如果遇到了1,看看在不在線性基中,如果在,那么它能被抵消,於是\(F_i=F_{i+1}\);否則它不能被抵消,於是對於任意\(x\)\(x\)\(x\ xor \ A_i\)有一個不能被抵消,於是\(F_i=\empty\)

C:考慮判定。可以視作:每次選擇一個長度等於\(A\)的連續0或長度等於\(B\)的連續1,將其變成任意值,問能不能還原成初始狀態。令\(A\le B\)(顯然可以搞到全1,所以0和1可以互換),如果出現了個長度大於等於\(B\)的連續1,把這段全部變成0,和兩邊0的連續段合並,因為\(A\le B\)所以可以又能夠操作這個大的連續段,反轉,合並,循環操作到整個序列同色。現在希望讓這個1出現,就將所有長度大於等於\(A\)的連續0全部變成1,然后判斷它是否存在長度大於等於B的連續1。可以DP,記所有長度大於等於\(A\)的連續0全部變成1的狀態,設\(f_{i,0/1,0/1}\)表示這樣的狀態下,最后是\(0/1\),是否出現過長度大於等於\(B\)的連續1。需要用數組\(g_n\)表示長度為\(n\)的序列,其中兩邊為1,中間的0所在連續段長度大於等於\(A\)的方案數,輔助轉移。兩者時間都是\(O(n^2)\)

D:顯然是按順序枚舉,如果當前點沒有被遍歷過,就將其所在的環都遍歷一遍並點亮。如果某次全部被點亮了那就退出。這相當於,設前\([1,A]\)個中第一個自環為\(i\)(也有不存在自環的情況),滿足\([1,i-1]\)所在的環的並包含\([A+1,n]\)。因為要滿足\(i\)是第一個所以要枚舉個\(j\)容斥,接下來的問題可以表示為三元組\((i-1-j,n-A,A-i)\)。假設是\((a,b,c)\),先給\(a\)搞個圓排列划分,即\(a!\),把\(b\)插入到\(a\)的圓排列中,即\(\prod_{i=a}^{b-1} i\),把\(c\)插入到圓排列中或自成一圓排列,即\(\prod_{i=a+b+1}^{a+b+c}i\)。所以貢獻是\(a!\frac{(a+b-1)!}{(a-1)!}\frac{(a+b+c)!}{(a+b)!}\)。枚舉\(i,j\),時間\(O(A^2+n)\)


7072. 【2021.04.30 NOI模擬】決戰聖誕樹

用生成函數寫出式子,然后考慮插值。代入\(K\)個點值進去,因為是循環卷積所以要滿足\(x^K=1\),也就是模意義下\(K\)次單位根。找出原根之后\(g^{\frac{P-1}{K}}\)的冪就是了。

現在分別維護\(K\)個問題。每個問題都是搞一棵樹,支持單點乘、鄰點乘、子樹乘、單點查、子樹查。如果沒有鄰點乘,用線段樹或分塊可以維護,時間分別是\(O(\lg^2 n)\)\(O(\sqrt n)\),線段樹中需要多次快速冪。現在有鄰點乘,把點按照度數,設定閾值,分成大點小點,改的時候大點在自身打標記,小點暴力改;單點查的時候遍歷周圍的大點。但是有個問題:子樹查。改大點的時候,可以把信息都掛在大點上(數據結構中),在查子樹的時候,沒有算到的,或多算到的信息只會和\(u,v\)有關,直接去掉或加上即可。

但是因為不能直接對0求逆元,所以這個方法可能會掛。盡管如此還是能過。不過再進行一些修改應該也可以搞。

事實上可以搞個序,先遍歷兒子,在遞歸遍歷兒子的子樹。這樣兒子連在一起,子樹(除了自身)也連在一起。於是鄰點的問題就解決了。

至於快速冪的問題,因為模數不大,所以可以算出每個數是原根的多少次方,以及原根的多少次方是什么。於是可以\(O(1)\)算。

最終每次操作時間\(O(\lg n)\)但是好慢。


7073. 【2021.5.4 NOI模擬】拆分

\(h\)擴展。枚舉\(m\),對\(a\)差分得到\(c\),要求\(c_1\ge 1,c_i\ge k\)。容易列出式子\(\sum_m h_m[x^{n-m-\frac{km(m-1)}{2}}]\prod_{i=1}^m\frac{1}{1-x^i}\)

如果\(k>0\),合法的\(m\)\(O(\sqrt n)\)的,直接算。

如果\(k=0\),重新看原題,發現就是求拆分數第\(n\)項,即\([x^n]\prod_{i>0}\frac{1}{1-x^i}\)。求這個東西有很多方法,可以借助五邊形數,需要求逆;也有個高級做法:畫出Ferrers圖(假設\(n=\sum a_i\),將\(a_i\)從大到小排序,第\(i\)列放\(a_i\)個方格),枚舉\((1,1)\)為左下角的極大正方形的邊長\(h\),剩下的兩個部分都是要求每個數不超過\(h\)的拆分,列出生成函數就是\(\sum x^{h^2}(\sum_{i=1}^h\frac{1}{1-x^i})^2\)。於是時間\(O(n\sqrt n)\)

卡常:1. 對五邊形數多項式求逆的時候,不要一開始把有值的地方存在某個數組然后遍歷這個數組,在求逆的過程中當場算五邊形數,常數小一些。2. 兩個int相加之后取模,如果用if,在本地不會變快,在OJ上變快了?

另外\(k=0\)時,結合兩種做法,得到\(\sum_m[x^{n-m}]\prod_{i=1}^m \frac{1}{1-x^i}=[x^n]\prod_{i>0}\frac{1}{1-x^i}\),不錯的發現。


7074. 【2021.5.4 NOI模擬】集合

轉化為取補集求並,找第一個不在並中的位置。枚舉\(r\),對於每個位置維護最后一次被覆蓋的時間。修改就是區間取max,查詢就是找到第一個最后被覆蓋的時間小於\(l\)的位置。

時間\(O(n\lg n)\)


AGC040

A:顯然局部最小值可以設為\(0\),確定這些值之后其它值很好貪心。

B:求出\(maxl,minr\)。分區間交是\([maxl,minr],[\dots,\dots]\)\([maxl,\dots],[\dots,minr]\)兩種情況討論。前者直接算,后者枚舉第一個區間交的右端點時多少然后計算。

C:假如沒有C,可以把奇數位的AB翻轉,變成了每次只能選擇兩個相鄰不同的,將其刪掉。顯然有解的條件是\(cnt_A=cnt_B\)。現在有了C,相當於可以任意地將C變成A或B,因此有\(|cnt_A-cnt_B|\le cnt_C\),計數即可。稍微推下式子就是\([x^\frac{n}{2}y^\frac{n}{2}]\frac{1}{(1-x)(1-y)}(1+x+y)^n\)。粗暴的做法是展開,變成計算\(\sum_{i=0}^{n/2}\binom{n}{i}\sum_{j=0}^{n/2}\binom{n-i}{j}\),可以維護\(f(n,m)=\sum_{i=0}^m\binom{n}{i}\)\(f(n,m)=\sum_{i=0}^m\binom{n}{i}=\sum_{i=0}^m\binom{n-1}{i-1}+\binom{n-1}{i}=2f(n-1,m)-\binom{n-1}{m}\),於是能\(O(n)\)計算;簡單的做法是計算不合法的方案數,即\((1+x+y)^n\)展開式中\(x\)\(y\)次數大於\(\frac{n}{2}\)的,因為不可能同時大於\(\frac{n}{2}\)所以很好計算。


6215. 【NOI2019模擬2019.6.14】硬幣游戲

可以看成:價值為\(a_i\)的,大小為\(1\)的物品,和價值為\(a_i+b_i\)的,大小為\(2\)的物品。

貪心:先將兩種物品從大到小排序,各選一段前綴。當空間加一時,先加入下一個大小為\(1\)的(如果沒有就丟掉個大小為\(1\)的放個大小為\(2\)的),然后嘗試用大小為\(2\)的替換兩個大小為\(1\)的。時間可以做到線性。


6216. 【NOI2019模擬2019.6.14】序列計數

暴力可以這么做:假設有個大小為字符集的表\(s_i\),從左到右掃,設當前字符為\(c\),對於\(i\neq c\)\(s_i'\leftarrow s_i+s_c\),並且答案加上\(s_c\)

根據這個矩陣乘法,朴素做法可以做到\(O(nC^3+qC^2\lg n)\)

發現這個矩陣有逆,把答案處理成:\([1,1,\dots,0]A_{l}A_{l+1}\dots A_{n}A_{n}^{-1}\dots A_R^{-1}A_{R+1}^{-1}[0,0,\dots,1]^T\)的形式,前半和后半都可以預處理。

可以做到\(O(nC^2+qC)\)。(在乘一個矩陣的時候,這個矩陣中有值的位置是\(O(C)\)的,所以只需要\(O(C^2)\)做乘法)

寫出來之后整理一下可以發現能夠簡單優化至\(O((n+q)C)\)


AGC043C Giant Graph

暴力可以想到按照\(i+j+k\)從高到低確定,同層的不會有邊,直接貪心即可。

考慮一維的求最大獨立集的過程:設\(f_i\)表示是否選\(i\),從后往前做,如果\(i\)存在后繼被選了,則\(f_i=0\)。發現其實可以視作:在這個DAG上的Nim游戲,從某個的出發如果先手必勝則\(f_i=0\)

可以推廣到三維的情況,相當於三個Nim游戲的疊加。於是算出sg函數,統計\(\sum[sg_{1,i}\ xor \ sg_{2,j} \ xor \ sg_{3,k}=0]w_iw_jw_k\)

FWT可以做,也可以暴力卷積,因為sg函數的取值是\(O(\sqrt m)\)


AGC041C Domino Quality

\(n\le 3\)的時候特判。

可以手動構造出\(n=4,5,6,7\)時每行每列只有\(3\)的方案。用這些方案拼接,在對角線處放即可。


AGC039C Division by Two with Something

操作可以視作:將二進制(從高到低)的最后一位取反之后移到最前面。

進一步分析,可以得到這個二進制應該長成:\(A\overline AA\overline A\dots A\overline AA\)的形式。上划線表示取反。找到這個極小\(A\)\(|A|\)就是操作次數。

極小通過容斥得出。先設\(f_{L}\)表示長度為\(L\)的不保證極小的\(A\)有多少個,通過給讀入字符串的前\(L\)位擴展成如上形式和原字符串比較,得到\(f_L\)\(s\)\(s+1\)的形式。然后容斥得到\(g_L\)\(g_L=f_L-\sum_{d|L,d<L}[\frac{L}{d}\mod 2=1]f_d\)


AGC038C LCMs

根據\(lcm(a,b)=ab/gcd(a,b)\),做個min卷積平方,每個位置除以下標的和就是答案。


AGC037C Numbers on a Circle

如果\(a_i\)剛剛被操作,那么\(a_i>a_{i-1}+a_{i+1}\)

考慮倒推,對於\(b_i>b_{i-1}+b_{i+1}\)的位置,如果\(b_i>a_i\),則\(b_i\)應該被修改,並且在它改變之前\(b_{i-1},b_{i+1}\)都不變,不會影響它的條件,所以\(b_i\)可以立即修改。

維護個堆,每次找出最大的,貪心地修改它。因為\(b_i\)變成\(b_i\mod(b_{i-1}+b_{i+1})\),必定減半,所以時間是\(O(n\lg n\lg V)\)


AGC035C Skolem XOR Tree

顯然\(n\)為二次冪的時候不行。

可以把形如\(2k,2k+1\)的配對。連邊\((1,2k),(2k,2k+1),(1,(2k+1)'),(1,(2k)')\)

如果\(2|n\),設\(x=lowbit(n),y=n-x\),連邊\((x,n),(y',n')\)


AGC034C Tests

每場考試可以看做關於\(a_i\)的函數,這是個分段的一次函數,兩端斜率分別為\(l\)\(u\),分界點在\((a_i,0)\)。將所有分段函數的最低點移到\(y=0\)處,於是我們希望決定\(a_i\)使得函數和達到\(\sum l_ib_i\)

有結論:最優解中,至多只有一個\(a_i\)取到了\((0,X)\),其它的不是\(0\)就是\(X\)。證明可以考慮,如果有兩個取\((0,X)\),根據其在各自函數中所在的段分類討論,發現都可以調整。

按照取\(X\)之后的貢獻排序。枚舉哪個取了\((0,X)\),然后二分一段取\(X\)的前綴即可。時間\(O(n\lg n)\)


7079. 【2021.5.9 NOI模擬】消除

可以轉化成:隨機一個排列,按照排列順序操作。如果當前點的祖先沒有操作過,\(cnt\)加一。求\(cnt\le K\)的概率。

\(f_{i,j,k}\)表示\(i\)子樹中,有\(j\)個點有貢獻,排列中位置在最后一個有貢獻的點后面的點有\(k\)個。於是可以做到\(O(n^4)\)

觀察轉移式,可以發現\(j\)這一維是個純的卷積。於是用插值將這一維搞掉,時間優化到了\(O(n^3)\),空間優化到了\(O(n^2)\)

其實轉移的時候,\(k\)這一維也可以利用卷積轉移,時間理論可達\(O(n^2\lg n)\)


ARC118

A:因為分母為100,所以可以100為循環節操作。搞出100以內有多少個空的,然后算出在第幾個循環節就可以找到了。

B:首先可以二分答案,然后得到每個\(B_i\)的取值范圍,分別求其上界和下界的和得到\(\sum B_i\)的取值范圍,如果\(m\)在范圍內就有解。二分出來之后一個個確定即可。如果用實數精度要開大(我開到1e-14),其實也可以用整數來二分。

C:先放入6,10,15,然后放入6或10或15的倍數即可。

E:考慮走到\((i,j)\),然后確定\((0..i,0..j)\)中的點。從\((i,j)\)轉移到\((i+1,j)\)的時候,決策一下第\(i+1\)行的點放在哪里,分在\((i+1,1..j-1)\)\((i+1,j+1..n)\)討論。發現這樣要記一下\((0..i,0..j)\)中已經確定了多少個點。於是可以記狀態\(f_{i,j,k,0/1,0/1}\),表示走到\((i,j)\)\((0..i,0..j)\)中確定了多少個點,其中\(i\)行,\(j\)列,是否有點的方案數。然后可以做到\(O(n^3)\)的復雜度。


CF1515G

類比一下無向圖,邊權異或的問題:

對於每個強聯通分量分別做。任取一個點,記其為\(rt\),然后搞一顆外向樹,記到點\(i\)的邊權和為\(\phi(i)\)

因為肯定存在從\(i\)\(rt\)的路徑,假設長度為\(s\),對於任意模數\(P\),從\(i\)\(rt\),然后繞\(P-1\)次長度為\(\phi(i)+s\)的圈回到\(rt\),總長為\((P-1)\phi(i)+Ps\equiv -\phi(i)\pmod P\)。所以可以直接認為\(i\)\(rt\)有長度為\(-\phi(i)\)的路徑。

每個點能走的環長的集合都等於根節點,因為可以先走\(-\phi(i)\)\(rt\),走完環之后再走\(\phi(i)\)回來。

於是如果有一條非樹邊\((u,v,w)\),可以認為貢獻了一個\(phi(u)+w-phi(v)\)長度的環。

求出所有環的gcd,於是能走的環長就是gcd的倍數。剩下的問題就好搞了。


7082. 【2021.5.10 NOI模擬】中單

由於結果是取max,可以將原來的限制拆成多個由更緊的限制組成的子問題,並且這些子問題的並恰好為原問題。

在這題中,相當於枚舉\(s_0,s_1,s_2\)的相對順序,然后轉化為了6個問題。每個問題都是個三維偏序,加上個詢問最大異或。

我的做法是對答案進行整體二分。從高位往低位,在當前層中,算出哪些詢問可以取到1。接下來當前位為0的修改往左走,為1的修改往右走;詢問如果可以取到1就往相反否則相同的地方走。然后里面就是個三維偏序,又因為詢問只需要問是否存在點在詢問范圍內,所以最后一維只需要存個最值。於是\(t\)排序,\(x\)用cdq歸並,\(y\)存最值就可以搞定了。總時間\(O(n\lg n\lg V)\),空間\(O(n)\)

其他人的做法陰間一些:先對\(t\)排序,套cdq分治:建Trie,然后按照\(x\)的大小歸並,如果是修改就在Trie上改\(y\)的最小值,如果是詢問在Trie上二分。時間也是\(O(n\lg n\lg V)\),空間是\(O(n\lg V)\)劣一些。


6213. 【NOI2019模擬2019.6.13】String

稍微分析可以可得一定是盡量匹配直到不能匹配划分為一段。

簡單做法:建出SAM,然后算出\(g_{u,v}\)表示\(u\)為開頭,結尾下一個為\(v\)的一段最短是多少。然后倍增+矩陣乘法。

更高明的做法:找到最長的長度\(len\)滿足所有長度為\(len\)的子串都被包含。接下來連邊,邊權都相當於是\(len\)。如果連出的圖有環,就找最小環長;如果無環,就找最長路。再算一波就可以得到答案。


6252. 【NOI2019模擬2019.7.4】天涯海角

可以看成:修改是對祖先鏈進行\(\pm1\)操作,以及改變某個點是否存在;查詢是查整棵樹\(>0\)的點權數。

我的做法:樹剖,對於每條重鏈分塊,長度為\(\sqrt {len}\)。對於每個塊,一開始排好序,用鏈表維護(權值相同的壓在一起),並且維護一個指針。整體加減的時候移動指針,散塊修改的時候對鏈表上節點進行操作。總時間\(O(n\sqrt n)\)。當把鏈表從動態分配空間+沒用的點不刪變成靜態分配空間+沒用的點刪,從2s+變成了500ms+。

有個更好的優化:不用鏈表,直接維護排序后的序列(權值相同的還要壓在一起)。散塊修改的時候,將修改的點和不修改的點分開,然后歸並。因為尋址連續,所以優化效果應該更加顯著。

更簡單的做法:每\(O(\sqrt n)\)次定期重構,對關鍵點建虛樹,每條邊維護桶和tag。可以做到每個詢問塊\(O(n)\)解決。總時間\(O(n\sqrt n)\),常數小,代碼短。


7083. 【2021.5.10 NOI模擬】騷豬(口胡)

考慮如果有區間\([l,r]\)\([L,R]\)包含,那么\([l,r]\)應該選擇和\([L,R]\)不同的顏色,否則不會更優。於是找到沒有被其它區間包含的區間的集合,記為\(W\)。其它的集合選擇一個\(W\)中包含它的區間(記為父親),最后取相反的顏色。

假設有解:如果\(|W|\)為偶數,那么可以給\(W\)交替分配顏色。對於某個位置,被\(W_i\)包含,若同時被\(W_{i-1}\)\(W_{i+1}\)包含,則沒問題;否則因為假設有解,一定存在其它區間包含它,並且那個區間的父親是\(W_i\)

如果\(|W|\)為奇數,也是交替分配顏色,然而\(W_{i-1},W_i\)顏色相同。如果某區間只被其中之一包含則沒有問題;如果被它們的交包含,又要要求還有個兒子區間包含它。因為有解,所以在某個解方案中,由鴿巢原理必定存在\(i\)\(W_{i-1},W_i\)同色,並且它們的交也滿足條件。所以說如果有解,在\(i\)的所有取值中,至少存在一種使得交替分配顏色有解。

於是枚舉\(i\)判斷。加速判斷:對於\(W_{i-1}\bigcap W_i\)內的點,要滿足被至少一個兒子區間包含,或被至少三個\(W\)區間包含;對於不在\(W_{i-1}\bigcap W_i\)的點,要滿足被至少一個兒子區間包含,或被至少兩個\(W\)區間包含。


7087. 【2021.5.18 NOI模擬】差異

其實就是把區間分段,要求每段中並不為空。

一種做法:設\(f_i\)表示\(i\)結尾的段數最少是多少。\(f_i\)可以直接貪心或DP得到,顯然\(f_i\)單調不降。然后還要維護方案數\(g_i\)。普通暴力是\(O(n^2)\),用單調棧+線段樹就可以\(O(n\lg n)\)了。

另一種做法:考慮設\(f_{i,j}\)表示到第\(i\)個,結尾為\(j\)的最小段數。歸納證明,對於\(f_i\),大概是\(mn+1,mn,mn+1\)三段。用線段樹維護即可。


7087. 【2021.5.18 NOI模擬】差異

原來長度為\(c\)的環會分成\(\gcd(c,k)\)\(\frac{c}{\gcd(c,k)}\)的環。反過來,枚舉分成的環\(l\),先統計這個環有多少個,然后划分,如果一個塊個數\(c\),則要滿足\(c=\gcd(lc,k)\)

於是可以寫個DP進行轉移(其實這轉移類似於exp)。時間復雜度\(O(nd(k))\)\(d\)表示約數個數。

實際上時間瓶頸在於統計環,因為尋址不連續。


7089. 【2021.5.18 NOI模擬】排序

既然求出前k大,直接A*。估價用網絡流來搞。只要每次估價都准確,那么估價的總次數最多為\(2nk\)

於是時間復雜度為\(O(nkMAXFLOW(n,m))\)

實際上由於相鄰的狀態之間變化比較小,所以可以直接帶修網絡流(支持加邊刪邊)搞。

(話說這里的A*應該是可以不用優先隊列的,直接遞歸即可,用帶修網絡流的話就可以不用存多個圖,會不會快一些?)


CFgym103069 2020 ICPC Asia East Continent Final

B:離線。考慮一個矩形貢獻在矩形最小值處。枚舉矩形的上下邊界,中間求最小值,於是變成一個序列數多少個區間最小值是什么。笛卡爾樹即可。

C:把\(x\)寫成\(x_0x_1\dots x_{63}\)的形式,若干次變換之后,其中每一位可以表示成一些\(x_i\)的異或。得到了\(f^i(x) \mod i\)等於多少,用\(\mod lowbit(i)\)得到最后幾位的信息。於是就得到若干條方程,一共有\(\sum_i \lg(lowbit(i))\)條方程,大概是\(O(n)\)。並且\(n\ge 50\),猜到自由元不是很多,枚舉之后挨個判定即可。

D:枚舉相交部分的兩個端點,顯然起點終點和端點之間,端點和端點之間都是最短路。得到若干個\((a,b)\)表示\(a\)個重復路,\(b\)個不重復路。由於二維偏序更大的可以不用計算,去掉那些之后剩下\(O(n)\)個。對於每個,用二分之類的做法搞一搞。

G:枚舉右端點,維護每個左端點的信息。可以視作:有一堆黑白點,支持:1. 區間黑白反轉。2. 區間白點權值加一。3. 詢問區間權值和。線段樹上節點上維護:權值和,黑白點個數。標記維護反轉標記,以及權值加一的標記(分別是黑點加的標記和白點加的標記)。

I:按照時間順序做。求出上一個活到最后的人存活到的時間,對於這個人,先計算它在被擋刀時候能否活下來,然后計算它沒有被擋刀的時候活多久。用線段樹二分維護。細節有點多。


ARC119 D - Grid Repainting 3

考慮給紅點的行列連邊(行和列分別分配點)。一次刪除相當於刪去一個點。

對於一個連通塊,隨便搞一棵生成樹,剝葉子地刪,最終剩下一個點。只要連通塊大小大於等於2就可以決定它在哪邊。

先求出兩邊孤立點的個數,接下來決定每個連通塊最終保留的點,顯然放在孤立點多的那邊。


ARC119 E - Pancakes

拆絕對值,二維偏序即可(\(l<r\)那維可以去掉)。


6248. 【NOI2019模擬2019.7.3】光影交錯

\(E_i\)表示當前和為\(i\)的時候,往后走的期望。大概可以列出\(E_i\)關於\(E_{i-1}\)\(E_{i+1}\)的式子。

根據\(E_{-\infty}=0\)\(E_{+\infty}=\frac{1}{p}\),把邊界開到\(3*10^6\)級別。按照套路,把式子轉化成\(E_i\)\(E_{i+1}\)的關系即可。


6250. 【NOI2019模擬2019.7.3】魔法咒語

生成函數計算即可。


6244. 【NOI2019模擬2019.7.1】為了部落

搞一個虛根,虛根和森林中每個根連邊。相當於欽定虛根度數為\(m\),與虛根相連單點點度數不超過\(K+1\)

借助prufer序列來計算即可。用點DP。注意組合數要分解質因數算。


7091. 【2021.5.26 NOI模擬】矩陣

首先想到burnside。考慮枚舉排列\(p\)\(q\),貢獻為\(c^{\sum_{x\in C_p,y\in C_q}}\gcd(x,y)\),加起來,最后乘\(\frac{1}{n!m!}\)

因為\(nm\le 1000\),所以較小值不超過\(31\),可以暴力枚舉其划分數,后面DP搞。

\(n\le m\),時間\(O(D(n)m^2)\)


7092. 【2021.5.26 NOI模擬】喂魚

回滾莫隊。現在要支持在序列上加入點,並查詢最長段。可以在每段的端點處記另一個端點是什么,就可以\(O(1)\)地加入並更新最大值。時間\(O(n\sqrt n)\)

實測這不一定比可撤銷並查集快(


ARC120E 1D Party

相鄰兩個相撞之后一定會反彈,否則不會更優。反彈可以看做穿過,於是相對位置發生了變化。

題目可以轉化為有個排列\(p_i\),一開始\(p_i=i\),對於每個\(1\le i<n\)都要進行一遍\(swap(p_i,p_{i+1})\),可以任意規定順序。最小化\(\frac{1}{2}\max |A_i-A_{p_i}|\)

顯然有DP:設\(f_{l,r,u,v}\)表示搞\([l,r]\)這個區間,\(l\)處為\(A_u\)\(r\)處為\(A_v\),其它位置原樣。轉移就枚舉下一次搞\(i,i+1\),那么可以分操作兩邊(\(i=l\)\(i=r-1\))和操作中間考慮。如果一開始就先將\(\max |A_i-A_{i+1}|\)貢獻入答案,操作兩邊只需看做往中間縮而不產生任何貢獻。

觀察DP,發現實際上就相當於:給序列分段,每段長度至少為\(2\),然后在兩個序列交界處兩點交換,最終貢獻為每段的頭尾的差。

只需要處理長度為\(2\)\(3\)的段。更長的段可以再分,不會更劣。寫出另一個DP即可。


LOJ3324. 「SNOI2020」取石子

打表可得,\((n,k)\)必勝當且僅當\(k\ge lowbit(n-1)\),其中\(lowbit\)是斐波拉契進制意義下的。

斐波拉契進制下數位DP即可。


7093. 【2021.5.28 NOI模擬】一道計算幾何的模板題

考慮求出每個\(x\)對應的最大和最小的\(y\)

可以發現\(x\)\(y\)分別的變化都是\(\rho\)的形狀,進入循環節前暴力統計。對應\(y\)環上的每個點處理出跳\(x\)環周期步之后到哪,然后倍增處理。

其實也可以:(假設求最小\(y\)),從小到大枚舉能走的\(y\),看看能貢獻到哪些\(x\)。把\(x\)連成環(跳\(y\)周期步),每次就是環上一段區間上未標記的位置標記。用並查集維護之。


7094. 【2021.5.28 NOI模擬】菜餚挑選

如果\(n\)為奇數:可以看做一個等分圓,對所有等腰三角形做。這樣每種邊出現3次。

如果\(n\)為偶數:先對前\(n-1\)個重復上面的操作,然后對所有長度為2的邊和\(n\)做一次,對所有長度為1的邊和\(n\)做兩次。然后再對前\(n-1\)中所有腰長大於等於2的等腰三角形做一次。


7097. 【2021.5.29 NOI模擬】Rhuzerv

陰間題意看了我3.5h

枚舉長度,填數和染色就可以分開計算了。前者直接算,后者用生成函數稍微推一下。實際上后者也有組合意義:選擇\(2(L-m)\)個點,這些點分別作為選擇的黑點、白點這樣交替,且最后一個點是白點。兩個白點之間都染黑。


7098. 【2021.5.29 NOI模擬】究竟

主要思想:對每個串建SAM。對於\(SAM_i\)中某個點\(x\),如果\(x_{trans(c)}=NULL\),則將其賦值成\({S_{i+1}}_{trans(c)}\)。相當於:在當前串中匹配某個子串,如果能匹配就匹配(轉移邊不變),否則接到下一個串繼續匹配。

用DP來實現一下,可以搞出\({S_{i}}_{trans(c)}\)\({S_{i+1}}_{trans(c)}\)之間的轉移,用矩陣來表示。一段區間的答案最終可以寫成:\(常數行向量*若干矩陣*某列向量\)的形式。分治搞一搞,用一些不特別的技巧即可。

(實際上也許可以通過修改轉移矩陣,使得求子區間和,變成直接求區間乘積?)


7096. 【2021.5.29 NOI模擬】簽door♂題

可以發現答案的前一半一定是1到n。

把1到n看做黑點,把n+1到2n看做白點。每個連通塊記個\(c_0,c_1\)表示未確定的黑點和白點數,可以視作每次選擇不在連通塊內的一個黑點和一個白點,將對應連通塊合並並將\(c_0\)\(c_1\)減一,變成個子問題。

考慮一號點。如果可以找到一個和它不在同個塊中的白點,匹配之后變成子問題;如果找不到,說明剩下\(n\)個白點跟它同塊,塊內至少有\(n\)條邊,又因為題目是只連好了\(n-1\)條邊,所以不存在。

於是按位確定,用可並堆可以做到\(O(n\lg n)\)


計蒜客2021復賽

一如既往地沒有質量。

A:直接DP,線段樹維護。

B:建支配樹之后隨便DP。

C:建重構樹。統計子樹內顏色個數可以:用樹狀數組,下標為最新出現的時間,將顏色掛在上面。進去子樹前記一下時間,出來時用總的減去在進去之前的。

D:用矩陣維護,LCT搞一搞。矩陣的等比數列是可以快速冪求的。另外這題模擬LCT暴力換根是可以過的。


ARC121

C:考慮每次將最小值往前提,如果奇偶性不對,搞一些變換使奇偶性調回來。分類討論一下。

D:如果必須選兩個,一定是開頭匹配結尾。可以選一個,相當於加入若干個0。

E:考慮容斥。\(dp_{i,j}\)表示\(i\)子樹至少有\(j\)個祖先走到后代的(不合法),直接轉移。


UR21 A 士兵調度

一種構造方法:考慮現在搞成一個\(l*l\)的矩形,然后給其增加一行一列。增加的時候就從遠方移動一個點過來。

因為\(m\)可能很小,所以先圍一個\(\sqrt{n-m}\)邊長的矩形,再進行這樣操作。次數大概是\(\sum_{i=n-m+1}^n \sqrt i\)

題解中有個上界分析:如果一行中有\(a\)個點選擇列,那么每列有超過\(a\)個點。於是有\(a^2\le n\)。如果要改變這行一些點從選列變成選行,那么至多會變化\(\sqrt n\)個點。每次合並的時候較小的那邊用啟發式合並來分析,那么上界為\(m\sqrt n+n\lg n+O(n+m)\)


7100. 【2021.6.1 NOI模擬】皮皮蝦

答案是行列式,對角線是\(F\),不是對角線是\(G\)

\(A_n(x)\)表示對角線是\(x\),不是對角線的位置是\(1\)。用第一行和其它的消,可以變成子問題,即\(A(x)=\frac{1}{x^{n-1}}(x-1)^{n-1}A_{n-1}(x+1)x\)

仔細觀察可以發現其通項:\(A_n(x)=(x-1)^{n-1}(x+n-1)\)

於是答案為\((F-G)^{n-1}(F+(n-1)G)\)。可以快速冪。因為\(F,G\)項數不多,所以也可以直接用點值搞,或者短多項式求冪。


7101. 【2021.6.1 NOI模擬】人生贏家

發現當\(n\ge 3\)時,只需要考慮相鄰兩個之間的字符的關系。

\(F_{A/C/G/T}\)表示從什么開始的生成函數,用\(x_A,x_C,x_G,x_T\)的多項式表示。列出方程,解一下,就可以得到式子。

實際上也可以通過路徑的特征進行分段,然后組合意義。


免責聲明!

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



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