1. 程式人生 > 其它 >2021.10做題記錄

2021.10做題記錄

P5243 [USACO19FEB]Moorio Kart P

考慮容斥,先把可能的算出來,然後再算 \(<Y\)
第一部分就直接把所有邊權枚舉出來乘一乘
\(<Y\) 的不難發現可以 dp
但是樸素的 dp 是 \(\mathcal O(n^3)\)
因此考慮根號分治
對於 \(n_i\leq \sqrt Y\) 的,這樣的我們列舉每一個不同的邊的長度,複雜度為 \(\mathcal O(n_i^2Y)\)
對於 \(n_i > \sqrt Y\) 的,這樣的最多隻有 \(\sqrt Y\) 個,複雜度為 \(\mathcal O(Y^2\sqrt Y)\)
第一類,根據均值不等式,所有 \(n_i\)

\(\sqrt Y\) 的時候複雜度最高,為 \(\mathcal O(Y^2\sqrt Y)\)
於是這道題目就愉快的在 \(\mathcal O(Y^2\sqrt Y)\) 的時間裡解決了
但是一個坑點是邊權可能為 0,所以判斷的時候可能會出問題,因為這個調了一個多小時

code

CF1580D

發現這個式子長得特別奇怪,拆一下變成 \(\sum a_{b_i}+a_{b_j}-2a_k\)
建出一棵笛卡爾樹,這個 \(a_k\) 就是他們的 lca
直接樹形 dp
\(\mathcal O(n^2)\)

code

CF1580B

這個東西本質上是深度為 \(k\) 的點恰好又 \(m\)

個的 \(n\) 個點的笛卡爾樹
所以直接 dp,\(f[i][j][d]\) 表示 \(i\) 個點 \(j\) 個深度為 \(k\) 的點,當前深度為 \(d\)
答案是 \(f[n][m][1]\)

code