1. 程式人生 > 其它 >Solution Set -「LOCAL」衝刺省選 Round X

Solution Set -「LOCAL」衝刺省選 Round X

\(\mathscr{Summary}\)

  時間利用效率?

  同學,你的效率呢?

  我真不知道中途幾個小時幹了啥,我也不知道我實在划水、神遊還是真的在自閉想題。

  雖然真實考場腎上腺素不會允許我這麼做,但模擬賽還是得提起精神啊。

  哦,我不是生競的,上面那句話當成偽科學。

\(\mathscr{Solution}\)

\(\mathscr{A}-\) 下落的數字

  給定以 \(1\) 為根的帶點權樹,定義 \(k-\)travel 為:從根出發,每次走到孩子點權集合中取到 lower_bound \(k\) 的點,若不存在則停下,設最後到達結點 \(u\)。現進行 \(m\) 次操作:

  1. 修改單點點權;
  2. 給定 \(k\),求當前樹上 \(k-\)travel 的終止點。

  \(n,m\le 2\times10^5\)


  樹剖。線段樹維護穿過一整段重鏈時,travel 值的取值區間。詢問時模擬跳重鏈。複雜度 \(\mathcal O((n+q)\log n)\)

\(\mathscr{B}-\) 序排速快

  給出一個排序方法:

其中,稱 \(i\) 為 partition point,當且僅當 \(\max_{j\le i} A_i\le\min_{j\ge i}A_j\)。對於 \(n=L..R\),求所有 \(n\) 階排列在該方法排序完成後的 \(\textit{cnt}\)

值之和。

  \(L\le R\le10^7\)


  缺的不是所謂結論,而是好看的結論。不要抓著“等價轉化”不放,因而捨棄一條捷徑。

  顯然應該對 \(A\) 的每個位置分別求被冒泡了多少次。考慮 \(A_i\) 經歷一次冒泡時:

  • \(\exist j<i,A_j<A_i\),則這樣的 \(j\) 減少一個;
  • 否則若 \(\exist i\le j<k,A_j\ge A_i>A_k\),則這樣的 \(j\) 減少一個;
  • 否則,\(i\) 是 partition point,不會被冒泡。

  結論比起我想到的要冗長,但是它“好看”——它是單純的計數,沒有取 \(\max\)

之類的數值討論。

  接下來,討論計數。對於第一類貢獻,發現就是逆序對個數。令 \(f(n)\) 表示所有 \(n\) 階排列的逆序對數量,那麼

\[f(n)=nf(n-1)+\frac{n(n-1)}{2}(n-1)!. \]

  對於第二類貢獻,注意到貢獻中對 \(A\) 的大小要求比較複雜,而根據排列具有的多樣“子問題”處理方式,我們可以列舉 \(n\) 所在的位置 \(j\),統計滿足條件的 \((i,j,k)\) 的數量。注意 \(k\) 實際上沒有參與數量貢獻,而對於一個 \(i<j\),顯然已有 \(A_j\ge A_i\),若 \((i,j)\) 有貢獻,則 \(\exist k>j,A_k<A_i\)。這一步用一個小 trick:概率問題與計數問題可以相互轉化來簡化討論。我們求 \(\exist k\) 的概率,顯然這些下標的具體值都不影響概率,問題就是——排列裡有 \(n-j+1\) 個數,求第一個數不是最大值的概率,顯然嘛,\(\frac{n-j}{n-j+1}\)。因而,設 \(g(n)\) 表示所有 \(n\) 階排列的第二類貢獻和,那麼

\[g(n)=ng(n-1)+(n-1)!\left(\sum_{i=1}^{n-1}1+\frac{n-i}{n-i+1}(i-1)\right). \]

後面那一坨隨便整理一下就能遞推求了。複雜度 \(\mathcal O(R)\)

\(\mathscr{C}-\)

  給定含 \(n\) 個點 \(m\) 條邊的點雙連通圖及其兩棵生成樹 \(T_1,T_2\),每次操作取 \(T_1\) 的一片葉子,去掉它與父親在 \(T_1\) 內的連邊,並指定其新父親。構造把 \(T_1\) 變成 \(T_2\) 的操作方案。

  \(n\le100\)


  被卡了一個點 qwq,簡單胡一下。

  搜尋,但是有條理。我們為兩棵樹指定同一個根,然後自上而下遞迴地構造出每條正確樹邊。需要做到一個清空 \(T_1\) 內某結點子樹的操作,暴力遞迴進去,把每個點丟到子樹外即可。講錯了不負責。(

  我本來淺寫了一下,沒有精細的限制,大概 \(50\) 分,然後加上一個“每次遍歷鄰接點,按一個隨機排列的順序遍歷”,就只剩最後一個 subtask 的最後一個點過不了。事實證明亂搞的時候應當隨機起來。(