• noi前第十六场 题解


    A. 小B的班级

    莫名想到了一个结论,这种题可以找到选中的点形成的重心。
    然后求所有点与重心距离的和即可。
    原因是,任意一个子树大小均小于 (m),所以总可以构造出方案。
    在这道题中,只要枚举最接近 (1) 号点的可能的重心,然后计算方案数就可以 (O(n^3))

    仔细想一下,可以把每个点到达重心的距离摊到每条边的贡献上。
    直接套用上面得出的结论,可以知道贡献的系数就是 (min{sz_a,sz_b}),然后随便写写这题就没了。
     

    B. 小B的环

    首先断环成链,把所有相邻并且相同的位置打个标记。
    每次的操作就是要求覆盖环内所有标记,找出位置不同的两个点,然后做类似卷积的东西。
    发现不会做,但是可以想一想暴力。
    因为左右端点每次都是右移一位,每次的变化量并不大,所以只要考虑新加入的右端点的贡献。
    写个类似链表的东西剪剪枝,(O(n^2)) 就过了。

    正解是这样的,考虑一个环在删除一段后保留的,也是一段连续区间。
    所以可以直接由该字符串,拆出若干段区间,对其中每一段区间考虑首尾不同的限制。
    因为拆出的区间是不交的,可以线性去枚举每个能保留的长度。
    考虑不合法的情况,一定是说整个字符串存在一个该长度+1大小的循环节。
    所以用 (KMP) 求个 (border) 来判断是否存在循环节就完了。
     

    C. 小B的农场

    可以发现这样一个事情,总存在一个周长为 (2max{w,h}+2) 的方案。
    所以答案一定跨过 (y=frac{h}{2}) 或者 (x=frac{w}{2})

    两个问题是等价的,可以分别分治去求。
    每次只要解决跨过 (l,r) 中点 (mid) 的答案。
    所以要求的大概是 (min limits_{ileq mid,j > mid}{ min{a_i,a_j}+min{b_i,b_j}+c_i+c_j })
    这是一个二维数点问题,只要对其中一维排序,用数据结构维护另一维即可。

    还有一个单 (log) 的做法,直接冲一个单调栈维护最值。
    然后用线段树维护区间修改、全局最大值就好了。

  • 相关阅读:
    mplayer命令行模式下的使用方法
    CentOS安装wireshark
    CentOS查看系统信息
    测试理论1
    单例模式
    接口测试
    rabbitmq
    redis数据库
    时间模块
    charles抓取数据
  • 原文地址:https://www.cnblogs.com/skyh/p/13405397.html
Copyright © 2020-2023  润新知