【2024全國賽前多校聯考1】逆序對

zzzYheng發表於2024-06-23

題意:

給定 \(n,K\)

對於 \(i=1,2,3,\cdots,n\),你需要求出在所有逆序對數為 \(k\) 個的排列中 \(i\) 位置在小根笛卡爾樹上的深度之和。

資料範圍:\(n \le 300,K \le \dfrac{n(n-1)}{2}\)

思路:

我們要求的是:

\[\sum_{inv(p)=K} dep(i) \]

這個 \(dep(i)\)\(i\) 的祖先個數,考慮哪些節點會成為 \(i\) 的祖先,畫幾個例子會發現就是 \(i\) 往左或往右的單調棧中的元素。

考慮兩邊的貢獻分開算,我們先算 \(i\) 往左的單調棧的大小和。

此時 \(i\) 右邊的元素不會對答案有貢獻,但是它們對逆序對數會有貢獻。具體而言,對於一個 \(j>i\) 的位置,根據其相對排名,其可以獨立貢獻 \(0,1,2,\cdots, j-1\) 個逆序對。

對於左邊,考慮 \(\text{dp}\),令 \(f(i,j)\) 表示長度為 \(i\),逆序對數為 \(j\) 的排列的單調棧大小和。

這個單調棧大小就是字尾 \(\min\) 個數。轉移時每次在前面插入一個數,列舉其相對排名。如果插入的數相對排名最小,那麼字尾 \(\min\) 個數加 \(1\),同時其會與所有相對排名比他小的陣列成逆序對。

利用字首和最佳化容易做到 \(\Theta(n^3)\) 處理這個 \(\text{dp}\)

而每個 \(j>i\) 的位置的貢獻相當於把 \(f(i)\) 的生成函式捲上 \(x^{0}+x^{1}+\cdots x^{j-1}\)

那麼 \(i\) 處的答案為:

\[[x^k]f(i)\cdot \prod_{j>i} x^0+x^1+\cdots +x^{j-1} \]

左邊已經預處理過了,考慮右邊。

倒著掃 \(i\),每次右邊部分多捲上一個 \(x^0+x^1+\cdots+x^{i-1}\),這個不用 \(\text{poly}\) 科技,直接字首和最佳化就行。單次 \(\Theta(n^2)\),總複雜度 \(\Theta(n^3)\)

求左右兩邊捲起來後的 \(k\) 次項係數也可以暴力。也是單次 \(\Theta(n^2)\),總複雜度 \(\Theta(n^3)\)

往右的單調棧的貢獻與往左的是對稱的,這裡略去了。

這樣我們就得到了一個 \(\Theta(n^3)\) 的解決演算法。

相關文章