三維偏序的優秀做法

DerrickLo發表於2024-07-09

感覺挺厲害的。

我們使用 \(f_i\) 表示恰有 \(i\) 維滿足偏序的數對 \((x,y)\) 的個數,\(g_i\) 表示欽定 \(i\) 維滿足偏序對的數對 \((x,y)\) 的個數。

那麼對於三維偏序:

\[g_0=\dbinom{0}{0}f_0+\dbinom{1}{0}f_1+\dbinom{2}{0}f_2+\dbinom{3}{0}f_3=f_0+f_1+f_2+f_3 \]

\[g_1=\dbinom{1}{1}f_1+\dbinom{2}{1}f_2+\dbinom{3}{1}f_3=f_1+2f_2+3f_3 \]

\[g_2=\dbinom{2}{2}f_2+\dbinom{3}{2}f_3=f_2+3f_3 \]

\[g_3=\dbinom{3}{3}f_3=f_3 \]

\(g_0\) 顯然等於 \(\dbinom{n}{2}\)\(g_1\) 只需要求三遍一維偏序就可以得到,\(g_2\) 只需要求三遍二維偏序就可以得到,這樣我們就可以得到一個方程組:

\[\begin{cases} f_0=f_3\\ f_0+f_1+f_2+f_3=g_0\\ f_1+2f_2+3f_3=g_1\\ f_2+3f_3=g_2 \end{cases}\]

解之即可。\(f_3\) 即為答案。時間複雜度是優秀的 \(\mathcal O(n\log n)\)

而且你會發現擴充到多維偏序貌似也是可以做的。

相關文章