九省聯考 2018 秘密襲擊

2022-06-20 16:27:09 字數 2442 閱讀 9424

題意

給定一顆含 $n$ 個結點的樹,每個點有點權 $d_i$ ,求所有聯通塊中第 $k$ 大之和。

$1\leq n,m,k\leq 1666,1\leq d_i\leq m$ ,時間限制 $5$ 秒。

題解一道很有趣的題目。

做法簡述:由於 $dp$ 為卷積形式對其多項式求點值,並通過類似整體 $dp$ 的方式維護變換,再通過拉格朗日插值還原多項式。

由於每次統計 $d_i$ 較難,乙個直觀的想法是轉化成 $0/1$ 問題,若答案為 $d_i$ ,則在 $[1,d_i]$ 均統計一遍。

具體的,答案可以寫成 $\sum_ kth(s)=\sum_ \sum_^n [i\leq kth(s)]=\sum_^n \sum_s [i\leq kth(s)]$ 。

那麼對於每個 $i$ ,將點權 $\geq i$ 的設為 $1$ ,其餘為 $0$ ,那麼我們只需要知道有多少個聯通塊其點權和 $\geq k$ 。

這是乙個簡單的樹形 $dp$ ,根據樹形揹包可得時間複雜度為 $\mathcal o(nkw)$ 。

據說就過了此題???喜提 $\text$ 最優解,比我的快 $20$ 倍(

我們將 $dp$ 式子寫出,設 $f_$ 表示當前根為 $i$ ,且考慮點權 $\geq j$ 的情況時選擇 $p$ 個 $1$ 的聯通塊個數。

也很好轉移

$$f_=\prod_ (f_+1) (\sum c_v=p-[d_i\geq j])

$$由於揹包的實質為卷積,不妨將該 $dp$ 寫成 $\text$ 的形式。設$$

\begin

f_&=\sum_^n f_\cdot x^p\\g_&=\sum_^n f_

\end

$$可得

$$\begin

f_&=x^\prod_ (f_+1)\\ans&=\sum_^ \sum_^m [x^j] g_\\&=\sum_^m[x^j] \sum_^m g(1,i)

\end

$$顯然這東西不能跑過去。

考慮進一步的優化,由於多項式乘法太慢我們不妨求出 $\sum_^m g(1,i)$ 多項式的點值最後在通過拉格朗日插值插回去,那麼我們需要求出 $n+1$ 個點值。

顯然$$

\begin

f_(x)&=x^ \prod_ f_ (x)\\g_ (x)&=\sum_ g_ (x)+f_ (x)

\end

$$但這還是 $o(nkw)$ 的。(悲

先考慮 $x$ 為定值且僅有乙個的情況。

我們需要維護的操作是維護 $n$ 個關於 $f,g$ 的點值陣列。

- 對於新點 $u$ ,$f$ 的字首賦值為 $x$ ,字尾賦值為 $1$ 。$g$ 陣列賦值為 $0$ 。

- 對於 $(u,v)$ ,我們現將 $v$ 的 $f$陣列全體加一,然後將兩個 $f$ 陣列對應位置相乘,將 $g$ 陣列對應位置相加

- 將 $u$ 的 $f$ 陣列加到 $g$ 陣列上。

注意到這變換是相同的,不妨設計乙個變換形式來實現快速轉移。

定義變換 $(a,b,c,d)$ 的作用為

$$(a,b,c,d):(f,g)\longrightarrow (af+b,cf+g+d)

$$容易將上方三個式子寫成相對應的變換,但我們要對於變換實現乘法

$$(a_1,b_1,c_1,d_1)\cdot (a_2,b_2,c_2,d_2)

$$這個也很好推

$$(a_1,b_1,c_1,d_1):(f,g)\longrightarrow (a_1f+b_1,c_1f+g+d_1)\\(a_2,b_2,c_2,d_2):(a_1f+b1,c_1f+g+d_1)\longrightarrow (a_1a_2f+b_1a_2+b_2,(c_2a_1+c_1)f+g+c_2b_1+d_1+d_2)

$$那麼

$$(a_1,b_1,c_1,d_1)\cdot(a_2,b_2,c_2,d_2)=(a_1a_2,b_1a_2+b_2,c_2a_1+c_1,c_2b_1+d_1+d_2)

$$這樣我們就可以知道每個點所對應的變換來快速求出答案了。

但這還是 $\mathcal o(nkw)$ 的。(悲

注意到上述操作很像區間加法,不妨用線段樹支援變換。

具體來講,我們類似打區間 $tag$ ,標記下傳的方式可以得到每個點的變換,而對於合併子樹也類似線段樹合併。

而這個線段樹合併需要支援標記下傳,並且由於變換的乘法沒有交換律我們需要考慮一下非空的子結點是 $u/v$ 。

這個線段樹合併的時/空複雜度也是 $\mathcal o(n\log n)$ 的,因為標記下傳僅在兩個線段樹的 $\cap$ 下傳,時間複雜度依然是 $\mathcal o(n\log n)$ 的,所以空間複雜度僅多了常數 $(2)$ 倍。

由於我們需要求 $x$ 在 $1\sim n+1$ 的點值需要將上述做法重複 $n+1$ 遍。

即總時間複雜度為 $\mathcal o(n^2\log n)$ ,但這常數肉眼可見的大,所以被暴力碾了。

九省聯考 秘密襲擊

剛開始看起來像樹形dp,卻感覺無從下手 其實正解是fft 每個值的排名往上回溯時都會改變,後效性滿滿的。根本不是一次樹形dp能解決的。那麼,每個值對其他值的排名有什麼影響呢?我們發現只有比val i 大的值才會影響它的排名。不妨每次取乙個點出來,令值大於改點的值變為1,小於改點的值變為0,問題就轉化...

題解 九省聯考 2018 秘密襲擊 coat

可以將危險程度轉化為 列舉權值 t in 1,w 如果某個連通塊權值不小於 t 的節點個數不小於 k 個那麼造成 1 的貢獻。考慮 dp 令 f 表示以 u 為根子樹中包含 u 的連通塊,有 j 個權值不小於 i 的節點的方案數。轉移就是前兩維列舉,第三維做揹包。不妨令 f z sum limits...

loj 2473 九省聯考 2018 秘密襲擊

給出一棵樹,每個節點有乙個權值。問所有連通塊中第k大元素的和模64123。設最權值為w,n 1666,w 1666 這一題正解有那麼長!標程也是有那麼長!肝了好久肝不動果斷轉暴力 include using namespace std const int n 1710,mod 64123 int i...