開個 map
記錄一下。數組
時間複雜度 \(O\left(1\right)\)。spa
根據咱們的常識,在正整數範圍內,除了如下幾個特例,其它狀況都是指數較大值較大。code
而後就作完了,時間複雜度 \(O\left(1\right)\)。class
樹狀數組裸題,枚舉中間點。遍歷
若是拓展到四個或更多位置的話用個 DP \(f_i,j\) 表示第 \(i\) 個位置強制,目前選了 \(j\) 個位置的最小值。而後用樹狀數組一樣維護 \(j-1\) 的狀況就行了。map
時間複雜度 \(O\left(n\log n\right)\)。im
發現 \(k\) 很小,考慮從它入手。img
以每種商品做爲起點 BFS(注意可能有多個起點),這樣就能算出每一個點到每種商品的最短距離。di
而後對於每一個點取出最近的 \(s\) 種貨物就行了,時間複雜度 \(O\left(km+ns\log s\right)\)。時間
策神的題的弱化版。
交換顯然會更改逆序對個數的奇偶性,但可不能夠作到線性呢?
首先題目中進行的操做次數都是 \(O\left(n\right)\) 級別的(雖然沒什麼用),這啓發咱們能夠模擬交換的過程。
咱們枚舉每個 \(i\),若是 \(a_i\not=i\) 就交換 \(a_{a_i}\) 和 \(a_i\)。
直接理解起來可能會有一點點抽象,畫個圖來看看。
由於是個排列,因此 \(i\) 向 \(a_i\) 連邊會造成一個個有向環。
每次交換咱們都會使得 \(a_{a_i}=a_i\),此後 \(a_i\) 位置不會再進行交換。
由於一共有 \(n\) 個數,因此最多交換 \(n\) 次。
時間複雜度 \(O\left(n\right)\)。
雖然邊數不少(同枚舉子集的 \(3^n\) 級別),但咱們並不關注具體的連邊狀況,咱們只關心連通問題。
考慮創建 \(2^n\) 個輔助點,向它們子集中 \(1\) 個數剛好少 \(1\) 的點連邊。
好比說 \(\texttt{1101}\) 就向 \(\texttt{0101 1001 1100}\) 連邊。
固然給定的 \(m\) 個點都要向 \(\left(2^n-1\right)\oplus a_i\) 連邊。
而後這個連通性又比較優美,每次 dfs 下去確定能遍歷到整個連通塊。
因此訪問過的點就不用訪問了,總時間複雜度 \(O\left(2^n\times n\right)\)。
本質是經過分層的方式在保證連通的狀況下縮減了多餘的邊數。