1. 程式人生 > 其它 >LGP5044口胡

LGP5044口胡

套路題。

對於這一類與 \(\max\) 有關的題,優先考慮笛卡爾樹。

建出笛卡爾樹,考慮處理以某個點 \(u\) 舉辦會議時,參加會議的成本。

這裡考慮詢問區間為 \([1,n]\)

明顯 \(u\) 的貢獻是 \(\sum_{i=1}^n\max([i,u])\)。(\([x,y]\) 代表序列上 \(x\)\(y\) 的所有陣列成的集合)

考慮列舉這個 \(\max\),在笛卡爾樹上的 \(\max\) 對應 LCA。

假設節點 \(u\) 到根節點所經過的節點為 \(v_1\sim v_k\)\(v_1=u,v_k=rt\)),那麼貢獻可以轉化為:

\[\sum_{i=1}^ka[v_i]\times (siz[v_i]-siz[v_{i-1}]) \]

在這裡我們假設 \(siz[v_0]=0\)

拆一下:

\[\sum_{i=1}^k a[v_i]\times siz[v_i]-\sum_{i=1}^{k-1}a[v_{i+1}]\times siz[v_i] \]\[a[rt]\times n+\sum_{i=1}^{k-1}(a[v_i]-a[v_{i+1}])\times siz[v_i] \]

很明顯 \(v_{i+1}\)\(v_i\) 的父親。轉化為每個點固定點權,尋找一個節點使得其到根節點的權值最小。

注意到每個節點的權值一定是負的。

於是,我們有了一個 \(O(nm)\) 的演算法。

考慮使用區間笛卡爾樹的套路。只有左鏈和右鏈的權值會發生變化。

改寫一下:(這裡以右鏈為例)

\[a[rt]\times(R-L+1)+\sum_{i=1}^k(a[v_i]-a[v_{i+1}])\times(R-l[v_i]+1)+V[v_1] \]\[a[rt]\times(R-L+1)+\sum_{i=1}^k(a[v_i]-a[v_{i+1}])\times(1-l[v_i])+(a[v_1]-a[rt])\times R+V[v_1] \]

\(V[v_1]\) 表示該節點到其左子樹中的某個節點,權值最小的權值。

注意需要減去當前“根節點”到真正的根節點的貢獻。

上述計算的是單個節點的貢獻,等價於一次函式。

考慮將單調棧可持久化,問題就變成了了靜態樹上一次函式最值。

(在這裡感謝Claris在U群中回答我的提問)

直接對其使用全域性平衡二叉樹即可。對每個節點建立凸包,直接歸併左右兒子即可。

每個節點被歸併 \(O(\log n)\) 次,複雜度是對的。

在凸包上二分轉化為對詢問排序,然後移動凸包上的答案指標。

總複雜度 \(O(n+m)\log n)\),可以通過。

程式碼在寫了在寫了