snake
考慮 \(q=1\) ,先預處理出每個方格是否被毒蛇覆蓋,若覆蓋則設方格權值為 \(1\) ,否則設為 \(0\) 。然後求解 \((1,1)\) 到 \((n,n)\) 的最短路即可。用 dijkstra 複雜度則為 \(\mathcal O(n^3+n^2\log n)\)。
由於網格大小為 \(n\times n\) ,那麼 \(n\) 秒以後的網格都是一樣的。所以 \(q\not =1\) 只需要對 \(t=1,2...n\) 分別求求解即可,時間複雜度 \(\mathcal O(n^3+n^3\log n)\)。
而方格權值要麼為 \(0\) ,要麼為 \(1\) ,使用 01BFS 即可使時間複雜度降為 \(\mathcal O(n^3)\)。
array
注意到 \(a_i\leq 10\)。
列舉每類數,強制這類數在區間 \([L,R]\) 中出現次數大於一半。
假設當前列舉的數為 \(c\) 。
那麼把 \(a_i=c\) 看成 \(+1\) ,\(a_i\not=c\) 看成 \(-1\),滿足條件的區間等價於區間和大於 \(0\) 。
設字首和陣列為 \(b_i\) ,那麼有 \(b_R>b_{L-1}\),使用歸併排序,線段樹或者樹狀陣列求出這樣的逆序對個數即可。
時間複雜度 \(\mathcal O((\max a_i)n\log n)\)。
fac
由於每個元素的答案是獨立的,所以只需要對於每個 \(A_i\) 求解答案然後求和即可。
設 \(f(x,k)\) 表示 \(x\) 經過操作 \(k\) 次後的答案,那麼有:
直接遞推即可做到 \(\mathcal O(Vk\log V)\)。其中 \(V=\max a_i\)。
對於 \(A_i\) 質因數只有一種,直接遞推即可。
對於 \(n=1\) 的問題,可以把所有轉移建邊。得到的圖除去自環就是一張 DAG 。那麼問題變成從 \(A_1\) 出發,走 \(k\) 步到達的點權和。
設 \(g(x,i)\) 表示沒有走過自環,走 \(i\) 步到達 \(x\) 的方案數。然後把剩下 \(k-i\) 步分配到每個點走自環數量上,插板法即可。
最後發現這個函式是積性函式,即對於 \(\gcd(x,y)=1,\) 有 \(f(x,k)\times f(y,k)=f(xy,k)\)。
所以預處理所有 \(p^x\) 處的值即可。
perm
\(f(i,j,S)\) 表示確定 \(1,2,\cdots,i\) 在 \(b\) 中的位置,其中有 \(j\) 個 \(c\) 確定為 \(1\)(\(i-j\) 個為 \(2\)),\(S\) 為剩餘沒填數的 \(b\) 位置集合。
1、\(c=1\)$$f(i,j,S)=\sum_{k\in S,|i+1-k|\le 1}f(i+1,j+1,S-{k})$$
2、\(c=2\)$$f(i,j,S)=\sum_{k\in S,|i+1-k|\le 2}f(i+1,j,S-{k})$$
注意到 \([i+3,n]\) 一定屬於 \(S\),並且 \([1,i]\) 的所有空位都是一樣的,所以 \(S\) 只要記 \([i+1,i+2]\) 即可。複雜度 \(O(n^2)\)。
tree
模擬題意暴力比較兩兩字典序,複雜度 \(\mathcal O(qn^2)\)。
首先 \(L\) 至少是 \(P_1\) 的一個字首。否則會有 \(L>P_1\),不滿足 \(L\) 是字典序最小的條件。在 \(L\) 是 \(P_1\) 字首的前提下,\(|L|\) 越小,則 \(L\) 字典序也越小。
當 \(a_i\) 是排列的情況下,若 \(sz_x=k\) ,則要求 \(1\sim k\) 全部在 \(sz_x\) 的子樹內。這裡給出一種做法:對於 \(i\in[1,n-1]\) ,設 \(a_x=i,a_y=i+1\),對 \((x,y)\) 路徑上除了 \(y\) 的點執行 \(+1\) 操作。那麼上述要求等價於 \(x\) 的權值等於一。樹剖線段樹維護子樹最小值(第一關鍵字按權值排序,第二關鍵字按 \(sz\) 排序)即可。時間複雜度 \(\mathcal O(n\log^2 n)\)。
當 \(a_i\) 不是排列時,就無法用上述方法了。我們需要找到更簡便的,描述字首這個限制:定義 \(d_u\) 表示 \(u\) 當前子樹和與滿足條件的子樹和之差。也就是說 \(d_u=\sum_{v\in sub(u)}a_v-\sum_{i=1}^{sz_u}P_{1_i}\)。
於是問題轉化為需要找到 \(sz\) 最小的,且 \(d=0\) 的點。同樣用樹剖線段樹來實現,時間複雜度 \(\mathcal O(n\log^2 n)\)