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]\times R+V[v_1]
\]
\(V[v_1]\) 表示该节点到其左子树中的某个节点,权值最小的权值。
注意需要减去当前“根节点”到真正的根节点的贡献。
上述计算的是单个节点的贡献,等价于一次函数。
考虑将单调栈可持久化,问题就变成了了静态树上一次函数最值。
(在这里感谢Claris在U群中回答我的提问)
直接对其使用全局平衡二叉树即可。对每个节点建立凸包,直接归并左右儿子即可。
每个节点被归并 \(O(\log n)\) 次,复杂度是对的。
在凸包上二分转化为对询问排序,然后移动凸包上的答案指针。
总复杂度 \(O(n+m)\log n)\),可以通过。
代码在写了在写了