枚舉\(C\)點,維護以\(C\)爲端點的射線,魚尾巴部分很好維護,考慮魚頭。
先枚舉\(B,D\)點,設\(B,D\)點的中點爲\(K\)。
那麼\(A,B,C,D\)合法須要知足:\(K\)在\(AC\)上,\(slope_{BD}*slope_{AC}=-1\)。
求出\(BC\)的方向向量後,第二個限制很好知足,考慮第一個限制。
首先\(K\)要在直線\(AC\)上,咱們知道:與一個向量點積相等的點在一條垂直其直線上。
那麼獲得向量\(AC\)的垂直向量(即向量\(BD\)),設爲\(P_1P_2\),則\(P_1K\)與\(P_1P_2\)的點積爲定值。
其次\(K\)要在線段\(AC\)上,咱們知道:與一個向量等距的點在一條平行於其的直線上。
因此依舊使用向量\(P_1P_2\),則\(P_1K\)與\(P_1P_2\)的叉積的合法範圍爲一個區間,預處理後二分解決。算法
用\(cx\)表示字符\(c\)連續出現\(x\)次,好比\(aaabbaaaabbaaacc=a3\ b2\ a4\ b2\ a3\ c2\)。
先考慮\(Sub3\)(不須要可持久化),考慮在當前串後面再接一段爲\(Border\)的條件,顯然只有第一段和最後一段能夠不全。
按上述規則對用\(cx\)表示後的串求\(kmp\),即上面的串的\(next\)數組爲:\(0\ 0 \ 0\ 2\ 3\ 0\)。
查詢就是暴力跳\(next\),使得新加字符的長度不斷遞增,貢獻形如等差數列。
而後考慮可持久化,因爲能夠離線因此可持久化是假的,咱們能夠構建樹形結構而後\(dfs\)解決。
暴跳\(next\)此時複雜度也假了,能夠對每一個字符構建\(kmp\)自動機,在\(dfs\)對其進行相應的維護便可。數組
仔細觀察能夠發現整個多邊形實際上是一個二叉樹結構。
暴力\(dp\)初始解,發現變換隻會對二叉樹產生微小改變,直接把原貢獻除掉再乘新的貢獻出解。網絡
對於\(30\%\),設\(f_{x,y}\)表示\(x,y\)之間是否合法,暴力\(bfs\)轉移(寫\(dfs\)的都退役了)。
對於\(70\%\),改良上面算法,讓兩邊分開轉移,即設\(g_{l,r,0/1}\)表示\(l,r\)之間,輪到誰轉移。
考慮對於全黑邊、全白邊、黑白交替邊各保留一棵生成樹,而後再作上述算法。
這樣顯然有問題,考慮問題在哪裏,而後修鍋。
考慮兩端分別走到了黑點,咱們要使得兩邊的黑段長度相同,因爲能夠來回走,因此只須要使得他們奇偶性相同。
可是二分圖上不管怎麼走奇偶性都不會改變,因此若原圖不爲一個二分圖,那麼就在生成樹上額外加一個自環。函數
令\(T\)爲轉移矩陣,那麼\(Ans_t=\sum_{i=0}^{L}\binom{L}{i}T^i[k|i-t]\)
單位根反演:\(Ans_t=\frac{1}{k}\sum_{i=0}^L \binom{L}{i}T^i\sum_{j=0}^{k-1}w_k^{j(i-t)}=\frac{1}{k}\sum_{j=0}^{k-1}w_{k}^{-jt}(1+T^iw_{k}^j)^L\)
令\(f_j=(1+T^iw_{k}^j)^L\),則\(Ans_t=\frac{1}{k}\sum_{j=0}^{k-1}f_j(w_k^{-t})^j\)。
顯然是個逆\(dft\)形式,因此如今咱們只須要支持一個任意長度\(dft\)了。
因爲\(w_k^{ij}=w_k^{{\binom{i+j}{2}}-{\binom{i}{2}}-{\binom{j}{2}}}\)。
令\(\delta=w_k^{-1}\),則\(Ans_t=\frac{1}{k}\sum_{j=0}^{k-1}f_j\delta^{\binom{j+t}{2}-\binom{j}{2}-\binom{t}{2}}=\frac{1}{k}\delta^{-\binom{t}{2}}\sum_{j=0}^{k-1}(f_j\delta^{-\binom{j}{2}})\delta^{\binom{j+t}{2}}\)。
來發卷積便可。垃圾出題人卡常數,注意矩乘時把\(27\)次取模變爲\(9\)次取模。優化
推推式子能夠發現,對於把一段劃分爲一個值,這個值取平均數最優。
而後不難發現:最終方案中劃分段越多,答案越優。
而後有\(O(mn)\)的貪心作法:從前日後維護每一段中位數,當中位數非遞增時則將尾部兩段合併。
考慮支持快速修改,核心思想依舊是模擬上述過程。
首先正着作一遍、倒着作一遍求出前綴與後綴的答案,設爲\(pre,suf\)。
那麼假設修改\(A_p\),咱們的目標就是找出最終方案中\(p\)所在段\([l,r]\),答案就是\(pre_{l-1}+ans_{l,r}+suf_{r+1}\)。
首先考慮固定一個右端點\(r\),如何求左端點的落點\(l\)。
設當前段平均數爲\(m_1\),新來的左邊段的平均數爲\(m_2\)。
若\(m_2>m_1\),則兩段需合併在一塊兒,\(m_1'\)與更前方平均數的差距縮小,不然就不須要並在一塊兒。
故這個左端點\(l\)能夠直接二分。
而後考慮如何求出正確的右端點,一樣二分,\(check\)當前段與以後一段的平均數大小關係便可。ui
麻將形態的\(DP\)如今已經麻木了。先考慮給一副牌判斷能不能胡。
設\(f_{i,a,b,0/1}\)表示前\(i\)各花色,\(E_{i-1,i,i+1}\)有\(a\)個順子,\(E_{i,i+1,i+2}\)有\(b\)個順子,是否有對子 的 最大面數。
轉移暴力就完事了。
爆搜一下發現\(f\)狀態數不多,因此\(dp\)套\(dp\)。
設\(g_{i,j,F}\)表示前\(i\)種花色拿了\(j\)張牌,\(f\)走到狀態\(F\)的不胡方案數,轉移大暴力。
答案\(Ans=\frac{\sum_{j=0}^{4n-13}g_{j}j!(4n-13-j)!}{(4n-13)!}\),注意\(f\)轉移時記得把選牌方案的組合數算上。spa
考慮一個操做\(1\)對全部線段樹的影響,設\((f_i,g_i)\)分別表示\(i\)點有\(tag\)、\(1\to i\)有\(tag\)的機率。
那麼設區間\([l,r]\)在線段樹對應路徑\(P\)。
分\(P\)上(不包括端點)、端點\(l,r\)、\(l,r\)子樹內(不包括\(l,r\))、路徑\(P\)側鏈、其它共五類點進行討論便可。排序
把答案作前綴和,求\(w(S)\leq k\)的方案數,最後再差分求解。
設初始狀態下\(1\)號節點的權值爲\(w\)。
若咱們要使得\(w'>w\),則只須要修改\(val<w\)的點。使得\(w'<w\)的方案同理。
咱們只須要讓上述兩種方案的一種成當即可,因此不妨容斥,算兩種方案都不成立的方案數。
以修改\(val<w\)的點的方案數爲例。
設\(f_u\)表示\(u\)點\(< w\)的方案數,這裏直接改設\(f_u\)爲機率方便計算。
對於奇數層,\(f_u=\prod f_v\)。對於偶數層,\(f_v=1-\prod(1-f_v)\),總複雜度爲\(O(n^2)\)。
一個比較妙的轉化:令\(g_u=[dep_u\ is\ odd]f_u + [dep_u\ is\ even](1-f_u)\)。
則轉移統一爲:\(g_u=\prod_v (1-g_v)\)。
注意到\(k\)每增長\(1\),至多隻會有兩個點的\(g\)發生變化,因此動態\(dp\)便可。
注意到:\(g_t=\prod_{i=1}^t (1-g_{p_i})=c_{p_1}\prod_{i=1}^t(1-g_{p_{i-1}})......\)。
暴力展開後會發現:\(g_t=\prod_{i=1}^t(1-g_{p_i})=g_{[l,m]}+(-1)^{m-l+1}g_{[l,m]}g_{[m+1,t]}\),線段樹直接維護。字符串
考慮對每一個點開一棵線段樹,直接維護該點的可達點是哪些。
對於一次修改,設\(S\)表示修改的點集,那麼咱們就是要給\(S\)中的每一棵線段樹加上\(S\)這個集合。
樹上差分後線段樹合併便可。
具體來講線段樹中維護\(>0\)的值的個數,不難發現這個東西是支持線段樹合併的。it
考慮求出機率生成函數\(f(x)=\sum_{i=0}^{\infty} E(X=i)x^i\),那麼答案就是\(F(1)'\)。
對於要按奇數次的點\(i\),構造\(H_{i}(x)=\frac{e^{\frac{p_i}{P}}-e^{\frac{-p_i}{P}}}{2}\),
同理對於要按偶數次的點\(i\),構造\(H_{i}(x)=\frac{e^{\frac{p_i}{P}}+e^{\frac{-p_i}{P}}}{2}\)。
那麼\(H(x)=\prod_{i=1}^n H_i(x)\),但這不能保證第一次結束時就中止,因此令\(G(x)=\prod_{i=1}^n(\frac{e^{\frac{p_i}{P}}+e^{\frac{-p_i}{P}}}{2})\)。
那麼令\(F(x)\)爲\(f(x)\)的指數型生成函數,則\(F(x)G(x)=H(x)\),即\(F(x)=\frac{H(x)}{G(x)}\)。
令\(h(x)\)、\(g(x)\)分別爲\(H(x)\)、\(G(x)\)的機率生成函數,則\(f(x)=\frac{h(x)}{g(x)}\),即\(f(1)'=\frac{h'(1)g(1)-h(1)g(1)'}{g(1)^2}\)。
以求\(g(1),g(1)'\)爲例,設\(G(x)=\sum_{i=-P}^P a_ie^{\frac{i}{P}x}\)。
那麼\(G(x)=\sum_{i=-P}^P a_i\sum_{j=0}^{\infty}\frac{({\frac{i}{P}}x)^j}{j!}\),故\(g(x)=\sum_{i=-P}^P\frac{a_i}{1-{\frac{i}{P}}x}\)。
一個大問題在於,當\(i=P\)時,\(g(x)\)在\(x=1\)處不收斂。但不難發現,\(g(x),h(x)\)同乘\(\prod_{i=-P}^P(1-{\frac{i}{P}}x)\)後答案不變,設爲\(g_2(x),h_2(x)\)。
那麼\(g_2(x)=\sum_{i=-P}^P a_i\prod_{j=-P,j\neq i}^P (1-{\frac{j}{P}}x)\)。
\(g_2(1)\)很好求,關鍵看\(g_2(1)'\)怎麼求。
首先暴力展開後有\([\prod_{i=1}^n (1-c_ix)]'=\sum_{i=1}^n(-c_i)\prod_{j\neq i} (1-c_jx)\)。
因此\(g_2(1)'=\sum_{i=-P}^P a_i\sum_{j=-P,j\neq i}^P (-\frac{j}{P}) \prod_{k\neq j,k\neq i} (1-\frac{k}{P}x)\),當\(x=1\)時,只有\(j=P\)或\(i=P\)有意義,故\(g_2(1)'\)可快速求。
把答案取個對數,那麼幾何平均數就變成了算術平均數。
而後就是愉快的分數規劃後\(AC\)自動機上\(dp\)。
對於\(m=2\),就是\(Fib\)數列。對於\(m=3\),打表可得遞推式:\(f_{2n}=4f_{2n-2}-f_{2n-4}\)。
問題變爲求\(\sum_{i=1}^n \binom{f(i)}{k}\)。
作一些簡單的變形:\(\sum_{i=1}^n \binom{f(i)}{k}=\sum_{i=1}^n \frac{P(f(i),k)}{k!}=\sum_{i=1}^n \frac{\sum_{j=0}^k S(k,j)(-1)^{k-j}f(i)^j}{k!}\)。
交換求和順序後,只用求\(\sum_{i=1}^n f(i)^t\)便可。
構造\(f(i)\)母函數,能夠獲得通向公式:\(f(n)=AC^n+BD^n\)。
那麼\(\sum_{i=1}^nf(i)^t=\sum_{i=1}^n (AC^i+BD^i)^t=\sum_{i=1}^n \sum_{j=0}^t \binom{t}{j}(AC^i)^j(BD^i)^{j-t}\),交換\(\sum\)後可得等比數列。
注意幾個細節:\((1)\)\(3,5\)在給定模數下無二次剩餘,故須要擴系。 \((2)\)特判等比數列\(q=1\)的狀況。
對於數\(k(k\leq n)\),如有\(c_k\)個,則稱存在區間\([k-c_k+1,k]\)。最後\([1,n]\)未覆蓋長度即爲答案。
考慮增長了全局加減後如何維護上述答案。
能夠經過平移區間\([1,n]\)來實現,因爲只有\(k\leq n\)的限制且每次只移動\(1\)格,因此順帶維護便可。
一張圖\(<V,E>\)合法當且僅當它的任意導出子圖\(<V',E'>\)知足\(|E'|\leq 2|V'|-2\)。
那麼非法即:\(|E'|-2|V'|>-2\)。
左邊是最大權閉合子圖形式,上個網絡流求一下\(max\)。
設生成樹權值和\(Val=\sum_{i=1}^n val_i\),那麼\(Val^k=(\sum_{i=1}^n val_i)^k=k!\sum_{k=\sum_{i=1}^nc_i}\frac{val_i^{c_i}}{c_i!}\)。
用變元矩陣樹定理,每條邊的權值變爲多項式\(\sum_{j=0}^{k} \frac{val^k}{k!}\),那麼答案就是\(k![x^k]\)。
其中除法能夠寫\(O(k^2)\)的多項式求逆。
首先判掉炮臺打炮臺的不合法方向。
其次每一個空地只會被兩個不一樣方向進入的炮臺打到,由於光路可逆,同方向進入的炮臺會互打。
剩下的就是\(2-sat\)裸題了。
限制倒過來看就是:把\(A,B\)串反過來,\(A_{i+1}\)存在一個後綴\(B\),知足\(B\)被\(A_i\)支配。
後綴的話就能夠考慮建後綴自動機而後跳\(parent\)樹了。
把\(A,B\)的反串一塊兒建後綴自動機,而後把\(A,B\)都掛到\(parent\)樹上,其中\(A\to Tree,Tree\to B,B\to A\)。
最後造成了一個\(DAG\),拓撲序\(dp\)求最長路。
先考慮合併兩條鏈,顯然是按照大小關係從大往小合併最優。
一棵樹並無什麼變化。
子任務\(1\sim 3\)直接輸出\(19^x\),記得\(x\)對\(\varphi(mod)\)取模。
子任務\(4\),發現模數在\(10^6\)數量級,暴力枚舉獲得\(mod=1145141\)後轉\(Task_{1\sim 3}\)。
子任務\(5\),
排序後能夠找到兩個\(x\)只相差\(2\)的結果,設爲\(a_0,a_2\),那麼\(mod|(19^2a_0-a_2)\)。
先用\(int128\)存\(19^2a_0-a_2\),枚舉其約數得\(mod=5211600617818708273\),而後轉\(Task_{1\sim 3}\)。
子任務\(6\sim 7\),因爲某些緣由發現\(19^x\)爆\(int\)居然存在循環節?而後暴力就好了。
子任務\(8\sim 10\),判素數,用\(Miller\)算法暴力。
子任務\(11\sim 13\),求\(\mu\)。
先篩出\(n^{\frac{1}{3}}\)之內的素數,把這些素數的貢獻暴力判掉。
那麼剩下的數無非三種狀況:\(p,pq,p^2\)。\(p^2\)很好判,\(p\)用\(Miller\)算法判,剩下的就是\(pq\)。
子任務\(14\),暴力判是否爲原根。
子任務\(15\),任務同子任務\(14\),但區間變大,模數變小。
首先找一個原根(好比\(g_0=6\)),而後把\(x\in [1,mod)\)表示爲\(g_0^y\)。
考慮\(x\)不爲原根的條件:存在\(q|mod-1\),知足\(x^{\frac{mod-1}{q}}=g_0^{y\frac{mod-1}{q}}\equiv 1\),即\(q|y\)。
因此若\(x=g_0^y\)是\(mod\)的一個原根,則\(y\perp (mod-1)\),把\(q\)篩出來後暴力。
子任務\(16\),堅信出題人會卡你,因此在\(1.5*10^9\)附近暴力,獲得\(mod=1515343657\),轉\(Task_{13}\)。
學校能夠分爲三類:\(k\)所特殊學校,與特殊學校同城市的學校,其它。
對於第三類,派系與陣營之間互不影響,分別\(O(n^2)\)進行\(dp\)便可。
對於第二類,咱們能夠把他們對陣營的貢獻加到第一類上,而後對派系作\(O(n^2)\)的\(dp\)。
對於第一類,按照城市分層,暴力作\(O(kM^2)\)的不滿\(dp\)。
最後作前綴和,而後把上述三類學校的答案合併便可。
題目大意:在樹上求\(K\)個聯通塊,這\(K\)個聯通塊存在交\(T\),且存在點\(v\)到\(K\)個聯通塊的並的最遠距離不超過\(L\)。
考慮枚舉\(K\)個聯通塊的並,而後就能夠套一個經典容斥:點\(-\)邊容斥了。
咱們以計算包含某個點\(u\)的方案數爲例。
設\(f_{u,j}\)表示子樹合併到\(u\)點,子樹內最遠距離不超過\(j\)的方案數+1,那麼\(f_{u,j}=1+\prod_v f_{v,j-1}\)。
設\(g_{u,j}\)表示子樹外(但包括\(u\)點)最遠距離不超過\(j\)的方案數,換根\(dp\),轉移\(g_{v,j}=1+g_{u,j-1} \prod_{t\neq v,t\in son(u)} f_{t,j-2}\)
考慮優化,\(f\)是一個比較顯然的長鏈剖分,關鍵仍是看\(g\)。
依舊考慮長鏈剖分,對於重鏈,暴力把輕鏈的\(f\)合併便可。
對於輕鏈,注意到咱們最終只須要使用\(g_{u,L}\)與\(g_{u,L-1}\),
設\(v\)子樹內的最遠點深度爲\(d\),則\(dp\)的第二維咱們只會用到\([L-d,L]\),故能夠只轉移這部分。
而這部分的深度依舊是輕鏈深度,因此總枚舉長度依舊會是線性。
而後來解決先後綴\(f\)之積的問題,注意到轉移與\(f\)的轉移很像,因此咱們能夠按照\(f\)逆序轉移\(g\)。
這樣對\(f\)數組進行撤銷操做獲得前綴,同時在轉移的過程當中維護後綴,從而避免了可持久化。
注意到:當\(v\)轉移到\(u\),且\(v\)的深度不及\(L-1\)時,咱們要支持後綴乘法。除此以外咱們還要支持全局加法。
能夠經過打標記的方式實現,維護全局標記\((a,b)\)表示\(x\to (ax+b)\)便可。
還有一個特別噁心的地方在於因爲轉移中存在\(+1\),因此\(f,g\)可能會變成\(0\),便可能出現後綴乘\(0\)。
因此再額外維護一個標記\(cov\)表示\([cov,L]\)的\(f/g\)都是\(0\),轉移時順帶移動\(cov\)標記便可。
把逆元線性處理了,複雜度能夠作到嚴格\(O(n)\)。
細節\(N\)多警告,真\(TM\)難調。
關鍵點生成樹,從起點與終點分別跑\(Dij\),對每一個點記錄它的最近歸屬起點、終點。
而後枚舉邊,把路徑拼起來更新答案。
使人髮指的二合一。關於\(c\)的計算,旋轉座標系後二維數點。
關於\(a,b\)的計算,咱們能夠抽象出一個模型:
有一列帶標號小球,每次能夠選擇交換兩個球或不交換,這兩種操做分別有收益\(a,b\),要求最後排列不變,求最少步數。
咱們首先假設都交換,獲得排列\(P_2\),咱們能夠用\(b-a\)的代價使得排列中兩個位置\((x,y)\)交換,問變回原排列的最少步數。
從前日後作,每次只交換實際位在枚舉位前的點,從增量的角度看,會發現每一步的交換一定能夠交換,因此模擬就行了。
枚舉\(a_i\),那麼就是要統計\((a_i+kA)\% B\in \{S_B\}\)的\(k\)的個數。
咱們知道,步長爲\(A\)的移動在模\(B\)意義下會造成\(gcd(A,B)\)個環,因此直接把每一個環的前綴和作出來。
把通訊站拆點,而後網絡流模型比較顯然。
考慮優化連邊,注意到咱們是給前綴連邊,因此能夠\(cdq\)分治,內部把左側通信站排序而後前綴連邊。
很久沒寫\(Treap\)了恰好寫一下。
容斥有幾個非法:\(Ans=\sum_{j=0}^{\lfloor \frac{n}{4} \rfloor} (-1)^j \binom{n-3j}{j}F(j)\)
其中\(F(j)\)就是\(4\)個指數形生成函數的卷積,用\(ntt\)優化。
第一問至關的簡單,設答案爲\(S\)。
考慮第二問,直觀想法:枚舉\(lca\)深度\(d_1\),兩個端點深度\(d_a,d_b\)。
可是不難發現,若\(d_1<d_a,d_b\),則\(lca\)段對值的影響絕對大於後半段的影響。
因此枚舉\(d_a,d_b\)後,\(lca\)其實惟一肯定。問題轉化爲:求兩個長度爲\(a',b'\)的數,使得二者計算值之和爲\(S'\)。
設兩個數的和爲\(Sum\),則易得他們的計算值\(Calc(Sum)=2Sum-popcount(Sun)=S'\)。
不妨枚舉\(popcount\),設\(f_{i,j,0/1}\)表示從低到高作了\(i\)位,放了\(j\)個\(1\),當且位是否被進位,暴力轉移便可。
複雜度爲至關不滿的\(O(d^5)\)。
設\(S_{x,t}\)表示居民\(x\)在\(t\)時刻還存活的狀態,設\(D_{x,t}\)表示死了的狀態。
\(2-sat\)的模型應該仍是比較清晰的:
對於\(0,t,x,y\):\(D_{x,t}\to D_{y,t+1}\),\(S_{y,t+1}\to S_{x,t}\)。對於\(1,t,x,y\):\(S_{x,t}\to D_{y,t}\)、\(S_{y,t}\to D_{x,t}\)。
除此以外,還有:\(D_{x,t}\to D_{x,t+1}\)、\(S_{x,t}\to S_{x,t-1}\)兩種邊要編滿。
顯然咱們能夠只把與\(x\)有關的時刻拿出來,其它的點丟棄,而後前綴連邊,這樣點數就優化到了\(2(n+m)\)。
不難發現這是一個\(DAG\),故\(x\)的答案個數爲:\(S_{x,t+1}\)不能到達\(D_{y,t+1}\)、且\(S_{y,t+1}\)不能到達\(D_{y,t+1}\)的\(y\)的個數。
拿個\(bitset\)拓撲排序。空間過小就分幾批處理。
使人髮指的二合一。
首先對每棵樹求把它劃分爲\(j\)條鏈(注意:首尾異構,若鏈長>1則方案數要乘二)的方案數。
設\(f_{u,j,0/1}\)表示昨晚\(u\)子樹內,已有\(j\)條鏈,當前點是否向上延伸的方案數。首尾異構的乘二能夠在鏈的最高點計算。
設第\(i\)棵樹劃分爲\(j\)條鏈的方案數爲\(val_{i,j}\)
其次是把枚舉每棵樹劃分爲多少段,求把這若干條鏈拼接在一塊兒,且同色不相臨的方案數。
有標號的環計數考慮破環爲鏈,而後欽定一棵特殊的樹放在開頭,若這棵樹分爲\(l\)條鏈,則方案數爲求出值除\(l\)。
容斥,用多項式完成排列組合。
對於非特殊樹,構建指數形生成函數:\(F_i(x)=\sum_{j=1}^{sz_i} val_{i,j}\sum_{k=1}^{j}(-1)^{j-k}\binom{j-1}{j-k}\frac{x^k}{k!}\)。
對於開頭的特殊樹,注意這裏還須要一個容斥來處理首尾相同。
先求總方案,再減首尾相同的方案,故生成函數爲:\(E_i(x)=\sum_{j=1}^{sz_i}\frac{val_{i,j}}{j}\sum_{k=1}^j(-1)^{j-k}\binom{j-1}{k-1}(\frac{x^{k-1}}{(k-1)!}-\frac{[j>1]x^{k-2}}{(k-2)!})\)。
所有捲起,係數之和來就是答案。
一個位置\(p\)要是最小循環的開頭,則\([p,n]\)須要知足:在當前串後面接一個串\(t\)後,可以成爲最小後綴。
而後就舒服了,咱們知道,這樣的位置不會超過\(logn\)個。
再證一遍,設有兩個備選後綴\(a,b\),其中\(|a|>|b|>\lfloor \frac{|a|}{2} \rfloor\)。
那麼首先\(b\)要是\(a\)的一個\(border\),有\(|b|>\lfloor \frac{|a|}{2}\rfloor\),因此\(a\)必定存在一個週期\(cw\)。
咱們不妨令\(a=cwcwc,b=cwc\)。
那麼\(at=cwcwct,bt=cwct\)。由於\(ct>cwct\),因此\(t>w\)。故\(cwcwct<cwct\),即\(at<bt\),故\(b\)必定不合法。
咱們如今就只須要暴力維護這\(logn\)個備選集合就行了。
不難發現,全部維護、查詢過程當中的\(lcp\)求解都爲\(lcp(1,i)\),故用\(Z-Algorithm\)預處理\(lcp(1,1\sim n)\)便可。
首先,度數最小的點在刪點後度數不會變大。
因此很容易獲得第一問的作法:不斷刪除當前度數最小的點,每刪一個點就更新一次答案。設最終答案爲\(p\)。
注意到這個過程當中,每次取出的點度數不會超過\(p\)。
因此咱們每次取出一個點,就把相鄰點刪掉,這樣每次刪掉點的個數不超過\(p+1\),最終點數知足\(q\ge \lfloor \frac{n}{p+1} \rfloor\)。
咱們把兩個金幣之間的距離看做一堆石子,通過必定轉化後問題變爲:
有\(m\)堆石子,石子之和不超過\(n\),博弈規則以下:每次能夠從第\(i\)堆中取\(t>0\)個石子,而後把這\(t\)個式子放入第\(i-1\)堆。
其中當\(i=1\)時取出的石子被丟棄,不能操做者敗。
不難發現這實際上是一個階梯博弈,咱們知道:階梯博弈先手必勝的條件爲:奇數層石子數異或和爲\(0\)。
容斥,咱們轉求先手必敗的方案數。
考慮拆位,咱們枚舉每一位到底有幾個\(1\),那麼當且經當每一位\(1\)的個數都爲偶數時,先手必敗。
即對於每個二進制位\(e\),構造生成函數\(F_e(x)=\sum_{i=0}^{m}\binom{m}{i}[i\%2=0]x^{2^ei}\),直接暴力卷積。
\(TMD\)這種題出在考場上誰作的出來啊?
根據\(OEIS\),這個數列有這樣一種神奇的生成方式:從\(\{0\}\)開始,每次\(0\to 01,1\to 10\)。
那麼咱們能夠根據逆運算\(01\to 0,10\to 1\)縮小序列的規模。同時有結論:對於長度\(>3\)的序列,只有惟一合法縮小方案。
而後咱們就能夠記搜了,記搜的每一層,咱們對當前串\(SK\)枚舉縮小方案(劃分方案),當長度\(\leq 3\)的時候特判出解。
設\(T_{[l,r]}\)表示只考慮區間\([l,r]\)的點和邊時的最小生成樹。
假設詢問\([l,r]\),此時咱們已經知道了\(T_{[1,l-1]}\)和\(T_{[r+1,n]}\),如今要加入\(1\sim n\)的一列邊,而後求最小生成樹。
每加入一條邊,一定就會刪掉一條邊(第一條除外),考慮刪掉的邊的位置。
不難發現,爲在\(T_{[1,l-1]}\)中是第\(1\)列點路徑的並,在\(T_{[r+1,n]}\)中是第\(n\)列點路徑的並,其實就是虛樹。
因此咱們其實不用維護\(T_{[1,l-1]}\),只須要維護以第\(1\)列的點爲關鍵點的虛樹,其中虛樹邊權是路徑上的最大邊權。
每次詢問,把兩棵虛樹以及\(1\sim n\)的邊拿出來跑最小生成樹便可。
如何求上述虛樹?實際上是同樣的,對於\(T_{[1,i]}\)維護以第\(1\)列、第\(i\)列爲關鍵點的虛樹,則第\(i\)列的答案從第\(i-1\)列轉移便可。