沒想到本身竟也能有機會寫下這篇題解呢。數組
枚舉\(AD\)兩點後發現\(BC\)與\(EF\)相對獨立,所以只須要計算合法的\(BC\)對數與\(EF\)對數,相乘便可。spa
先考慮計算\(EF\)的對數。肯定\(AD\)後,知足條件的\(EF\)對數即爲在某個半平面內與\(D\)點距離相等的點對數目。枚舉\(D\)後若亂序枚舉\(A\),則須要再\(O(n)\)地處理\(A\)肯定的半平面內的合法點對數目。能夠按照極角序枚舉\(A\),並用單點指針肯定半平面的範圍,便可在總計\(O(n^2)\)的時間複雜度內解決這部分問題。指針
再考慮計算\(BC\)的對數。發現\(AD\)對\(BC\)的限制很強,直接限定了\(BC\)的斜率(或言之方向向量,由於有可能斜率不存在)以及中點座標,所以能夠考慮直接\(O(n^2)\)預處理出全部\(BC\)點對,每次查詢時只須要在對應的值上二分找出範圍限制便可。總時間複雜度\(O(n^2\log n)\)。code
具體實現上,根據「與向量\((a,b)\)點積相同的點在一條垂直向量\((a,b)\)的直線上,與向量\((a,b)\)叉積相同的點在一條平行向量\((a,b)\)的直線上」,咱們能夠直接經過點積與叉積肯定\(BC\)的具體位置。blog
code排序
考慮解決沒有\(2\)操做的子問題。遊戲
定義一個二元組\((x,c)\)表示有連續的\(x\)個\(c\)字符。考慮對一個由二元組組成的字符串求\(next\)數組。能夠發現若\(next\)須要跨越某個二元組,則必須知足先後綴對應二元組相等(起始位置除外),這裏的二元組相等定義爲每一維均相等。起始位置二元組的字符要求相等而長度不要求相等,但必須大於等於前綴的對應位置。字符串
如今考慮加入一個二元組\((x,c)\)後如何快速求得答案。沿\(next\)鏈往前跳時,每次遇到字符爲\(c\)的二元組時,都可以爲新加入的\((x,c)\)中的某一段區間找到其\(next\),其貢獻爲一個公差爲\(1\)的等差數列。特別的,新加入的\((x,c)\)的一段後綴可能只能與首位二元組匹配,此時的貢獻是首位二元組長度的若干倍。get
這樣就解決了沒有\(2\)操做的子問題。當出現\(2\)操做時,常規的求解\(next\)數組的作法就再也不適用了——求解\(next\)數組的時間複雜度是均攤的。所以,咱們須要對求\(next\)的過程進行優化。首先離線建樹,在自上而下\(dfs\)的過程當中,維護每條\(next\)鏈上的\(kmp\)自動機(即\(f_{i,j,k}\)表示在\(i\)狀態下加入一個二元組\((j,k)\)後\(next\)會指向哪裏,同時即\(g_{i,j,k}\)表示對答案產生的貢獻),每次修改是複製前一位的\(f\)數組,並將\(f_{i,x,c}\)修改成\(i\),將\(g_{i,x,1...c}\)修改成一個首項爲前\(i-1\)個二元組總長度\(+1\),公差爲\(1\)的等差數列,查詢即查詢前綴和。用可持久化線段樹實現便可,複雜度\(O(n\log n)\)。
具體實現上,能夠對\(g_{i,j,k}\)全體減下標,這樣修改就變成了區間賦值。最後再加上下標的等差數列便可。
最優策略下每次旋轉操做必定知足\(d=n\),所以總步數就等於初始局面下兩端點均不是\(n\)的邊的條數(邊界上的邊不計入)。
將初始局面下全部與\(n\)相鄰的點(包括\(1\)和\(n-1\))排序,這樣遊戲終止的條件就變成了將。對於排序後相鄰的兩點\(l,r\),必然存在一條邊\((l,r)\),不然原圖就不是一個合法的三角剖分。此時若\(l+1=r\)那麼這條邊沒有操做空間,能夠直接忽視,不然在\((l,r)\)中必然存在一個點\(p\)使得\((l,p),(p,r)\)均有邊,這樣對\((l,r)\)進行一次旋轉操做後便可獲得邊\((p,n)\),同時相等於在\((l,r)\)中間插入了一個數\(p\)。接下來區間\((l,p)\)與\((p,r)\)獨立,方案數便可分別計算。
不難發現上述過程當中隱含的樹形結構。以初始局面下全部\(l+1<r\)的邊\((l,r)\)做爲樹根,便可獲得一片二叉樹森林,其中每一個節點必須在其父親操做以後才能操做。這樣方案數邊不難計算:合併兩棵子樹的方案數爲組合數。
對於一次任意的旋轉操做,能夠發現要麼是在最優策略下操做了一步使得最優步數減\(1\),在樹形結構上的表現爲刪除某棵二叉樹的根,將其左右子樹分別做爲兩棵新的二叉樹,要麼是對某個點(並且必定是左兒子)進行了一次\(rotate\)操做,不改變最優步數。兩種狀況的方案數都可以經過計算組合數逆元求出。
時間複雜度\(O(n+m)\)或\(O((n+m)\log n)\)。
有一個\(O(m^2)\)的暴力\(dp\)作法,記\(f_{i,j}\)表示是否存在一條從\(i\)到\(j\)的迴文路徑,轉移即分別枚舉\(i,j\)的相鄰點轉移便可。
這個\(dp\)能夠進行一些小優化,額外記\(g_{i,j}\)表示\(i\)是否存在一個相鄰點\(i'\)知足\(f_{i',j}=1\),這樣轉移就只須要枚舉一遍,複雜度\(O(nm)\)。
(不知道怎麼想的)考慮減小邊數。對於全部鏈接同色點的邊,每個連通塊內只須要保留一棵生成樹便可獲得與原圖相同的結果。特別的,若該連通塊不是二分圖,則須要添加一條自環。對於全部鏈接異色點的邊作一樣的事情,這樣總邊數就降到了\(O(n)\)級別,再套用上面的作法便可。
考慮枚舉實際走了\(i\)步,會發現走\(i\)步的方案數剛好就是\(\binom Li\)。因而咱們要求的答案就是:
\[b_t=\sum_{i=0}^L[i\%k=t]\binom Li(A^i)_{x,y}\]
隨手單位根反演一下
\[b_t=\frac{1}{k}\sum_{i=0}^L\sum_{j=0}^{k-1}\omega_k^{j(i-t)}\binom Li(A^i)_{x,y}\\=\frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{-jt}\sum_{i=0}^L\binom Li\omega_k^{ij}(A^i)_{x,y}\\=\frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{-jt}((\omega_k^jA+I)^L)_{x,y}\]
令\(a_j=((\omega_k^jA+I)^L)_{x,y}\),而後原式(差很少)就變成了
\[b_t=\sum_{j=0}^{k-1}\omega_k^{jt}a_j\]
這不就是裸的\(FFT\)?
對於\(k=2^n\)的Case,直接\(FFT\)便可,複雜度\(O(3^3k\log L+k\log k)\),指望得分\(60\)分。
出考場後:
接着lun給我丟了份16年myy的集訓隊論文。
因此接下來咱們作剩下的\(40\)分。
考慮\(jt=\frac{(j+t)^2-j^2-t^2}{2}\),因而原式就變成了
\[b_t=\sum_{j=0}^{k-1}\frac{\omega_k^{\frac{(j+t)^2}{2}}}{\omega_k^{\frac{j^2}{2}}\omega_k^{\frac{t^2}{2}}}a_j\]
移項後就能夠直接卷積了!
然而此時你會發現\(\frac{x^2}{2}\)這東西有可能不是整數,也即須要用到\(2k\)次單位根,而和(du)善(liu)的lun必定也會造數據來卡你。
不過不要慌,轉念一想,你會發現還有一種轉化的方法:
\(jt=\binom{j+t}{2}-\binom j2-\binom t2\)
因而愉快地套用上式就行啦。
\[b_t=\sum_{j=0}^{k-1}\frac{\omega_k^{\binom{j+t}{2}}}{\omega_k^{\binom{j}{2}}\omega_k^{\binom{t}{2}}}a_j\]
\(MTT\)實現卷積便可,複雜度依舊爲\(O(3^3k\log L+k\log k)\)。
證實?看官方題解吧
第一個結論是答案的構造方式:從左到右依次加數,當發現當前的數比前邊的數字小的時候就將整段替換成全部數的加權平均值,用一個單調棧便可維護。這同時也是\(50\)分\(O(nm)\)的作法。
如下全部下標(除了\(x\))均爲單調棧的下標而非原序列的下標。
如今對\(x\)位置進行了權值的修改。考慮最終答案裏\(x\)位置的所在區間(段),設之爲\([L_0,R_0]\),則\([1...L_0-1],[R_0+1...n']\)在最終答案中的結構與單獨考慮之的結構是同樣的。也就是說只須要維護出全部先後綴的單調棧,再想辦法對於每次詢問找出\(L_0,R_0\)就好了。
考慮枚舉一個\(R\)檢查其是否能夠做爲\(R_0\),對這個\(R\)找出以其爲右端點向左合併時會合併到的位置,記其爲\(L\),則若\([L,R]\)的平均數小於\(R+1\)的權值則這個\(R\)就是咱們要找的\(R_0\)。
枚舉\(R\)能夠改成用二分實現,同時對於一個給定的\(R\)咱們能夠經過在線段樹上二分的方式作到\(O(\log n)\)地找到其對應的\(L\)。所以總複雜度\(O(n\log n+m\log^2n)\)。