省选模拟57 题解

A. Max

看到这个数据范围就想一下是不是可以状压。

然后发现只有 $m$ 压的下。

容易发现题目中的顺序并不关键,其实可以无视掉原有的操作顺序。

然后现在给 $1... n$ 每个元素分配一些操作就好了。

这样在给第 $i+1$ 个元素分配操作之前,我们只关注已经分配的操作集合、最大的元素大小。

然后就可以写一个暴力的状压 $dp$,可能要枚举一下子集,然后复杂度有点爆炸。

然后发现这个枚举子集其实没啥必要,统一做一下 dp,可以改成逐位转移的形式。

 

B. Paint

容易发现可以枚举上下边界,然后问题转化为最大的间隔。

这样用一个 set 来维护一下,复杂度就是 $O(n^2 log)$ 的了。

然后人就没了。可以考虑进行一下这样的操作。

我们钦定左右边界必须跨过一个位置 $x$,那么问题就转化为维护 $\leq x$ 的最大的左端点,和 $\geq x$ 的最小的右端点。

然后发现一个特殊的性质,本题的答案不小于 $2*(max(w,h)+1)$,因为一定存在这样触碰到两个边界的方案。

这样只要枚举一次上下边界,枚举一次左右边界,分别钦定这个位置 $x$ 为 $\frac{w}{2}$ , $\frac{h}{2}$ 就好了。

然后这样就是平方复杂度了。优化的办法是扫描线。

对于一个右端点维护每个左端点的答案即可。

然后发现这个是对两个元素分别取 $\max$,同时维护两个元素相减再减下标的最大值,其实并不容易在线段树上处理。

然后发现弄一个单调栈开在外面,就可以直接用区间加减操作实现了。

 

C. Decompose

看一下题意,发现对于树上每个点只需要维护一个简单的 $dp$ 数组。

然后还要支持动态修改点权操作,那肯定就是动态 $dp$ 了啊。

所以就考虑如何构造转移矩阵就行了。

树剖维护动态 $dp$ 的套路大概就是对于每个点,暴力维护轻儿子的信息。

然后这个点的 $dp$ 值写成 重儿子的 $dp$ 矩阵乘当前节点轻儿子贡献代表的转移矩阵的形式。

对于这道题, $dp_{x,i}$ 由 $dp_{son,i-1}$ 转移而来,其实只需要考虑这个 $son$ 是轻儿子还是重儿子。

如果是重儿子,那么每个轻儿子都取自己的最优。

如果是轻儿子,那么重儿子取自己的最优,其中一个轻儿子放弃自己的最优而来选 $dp_{son,i-1}$。

因为要能支持动态的维护这个贡献,所以可以想到搞一个 multiset,来动态维护最大的 $dp_{son,i-1} - \max{dp_{son,j}}$。

然后搞一下树剖+线段树维护矩阵的操作就好了。

posted @ 2020-03-29 22:05  skyh  阅读(171)  评论(0编辑  收藏  举报