zoukankan      html  css  js  c++  java
  • 省选模拟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}}$。

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

  • 相关阅读:
    linux系统编程之(一) 信号量
    linux 工具(1)------终端提示符配置
    网络那点事之socket队列
    磨刀砍柴
    线程的分离链接属性
    error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
    mkdir和_mkdir的区别
    错误 1 error C4996: 'getcwd': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getcwd. See online help for details.
    error C4996: 'getcwd': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getcwd. See online help for details. c:users12968desktop estapp estapp estapp.c
    .net与C#
  • 原文地址:https://www.cnblogs.com/skyh/p/12595309.html
Copyright © 2011-2022 走看看