25.09.28

QOJ903

这个题神了。

路径是个全局信息,这显然是不利于我们做的,所需的状态空间很大。

这个题用到了一种很神秘的方法来把这个全局信息局部化。

具体地:我们设 \(f_u\)\(u\) 子树内选路径的贡献和,考虑求 \(f_u\)

首先记 \(sum_u=\sum f_v\),那么 \(f_u\) 至少可以是 \(sum_u\)

然后枚举 \(LCA(x,y)=u\) 的路径,考虑能不能加进去,发现我们考虑不来。

这个时候就有个很重要的事情了,我们考虑 \(\delta_u=f_u-sum_u\) 的含义是什么?选了经过 \(u\) 的路径带来的增量。

那么对于一条路径 \((x,y)\),我们若把他选了,那么每个 \(z\in path(x,y)\)\(\delta_u\) 我们都拿不到,这也就是我们在 \(sum_u\) 的基础上亏损的部分。

\(f_u\) 就算完了。

接下来的想法比较考观察力,可以观察样例得到启发:我们加一条路径要减去一堆 \(\delta\) 但只能收获 \(1\) 的权值,自然只能选择 \(\delta=0\) 的那些点。

然而这还不是全部,如果这个点被占用了会导致取不到原最优解,那么也不能被考虑。

剩下能被考虑的点构成若干连通块,每个块里的任意点对都是合法的。

现在考虑如何计算能否在一个点不被占用的情况下取到全局最优解,这类问题一个经典想法是拼一下,看内部的和外部的能不能拼成我们要的。

于是设 \(g_u\) 为只考虑 \(u\) 子树外的,有点类似换根一样地做一下即可。

这里一个小细节是我们可能涉及到查询完全不在某棵子树内的路径中最优的一条,这个看着有点烦,事实上只需找出最大者,然后在把最大者无法更新的至多两棵子树拉过来暴力即可。

然后还有些数据结构维护啥的,总之是平凡的。

QOJ5137

显然先除一堆,然后加加减减。

显然根据我忘了是啥理论,我们最终取到的相同值肯定是 \(\lfloor\dfrac{a_i}{2^j}\rfloor\) 这样的东西,不妨对每个都查一下。

考虑每个位置上其实都有个 \(\mathcal{O}(\lg W)\) 段的一次函数,然后我们的查询 \(x\) 事实上就是取每个点在 \(x\) 算出来值的前 \(n-m\) 大。

显然可以两棵树状数组分别维护 \(y=x+b\)\(y=-x+b\) 两种函数在 \(x\) 时的 \(\sum b\) 及个数,二分归并一下就能查。

P9174

做得过于极限了于是记录一下。

一开始认为改一个没改过的就一定少一种颜色,没意识到这个没改过的可能改了别人就有备份。

冷静一下就知道这个过程不好刻画,但是状态数感觉上并不多。

直接打一个划分出来,发现大概是 \(10^6\) 的级别,不太好。

但是想到划分里面其实有些 5553333322 这样的东西,本质是相同的。

于是再压一下状态数来到了惊人的 \(42\),也就是宇宙的真理!

爽快矩阵。

P10764

一开始在那拆笛卡尔树,唐完了。

还是回到一开始的想法,计算 \(\sum\min(p_i,s_i)-h_i\)

一个经典的转化: \(\min(a,b)=a+b-\max(a,b)\),我们这里 \(\max(p_i,s_i)\) 就是全局最大值,于是变为:\(\sum p_i+s_i-p_n-h_i\)

分开计算,\(h_i\) 是容易的,另外三个本质是一个东西,以 \(p_i\) 为例。

\(f_{i,j}\) 表示考虑到 \(p_i=j\),然后考虑现在有 \(a\le b\)

显然 \(f_{i+1,j\ge b}\gets 2\times f_{i,b}\),而 \(f_{i+1,b}\gets f_{i,j<b}\)\(f_{i+1,a}\gets f_{i,j<a}\),且 \(f_{i+1,j<a}=0\)

这些都是线段树能做的,而我们要查询的 \(2^{n-i}\times h\times f_{i,h}\) 后面这块也是可以放在线段树上的。

posted @ 2025-10-31 09:25  LQ636721  阅读(4)  评论(0)    收藏  举报