1 条题解

  • 0
    @ 2025-10-30 16:52:01

    题目翻译

    NN 座山峰,第 ii 座高度为 hih_i
    若在第 ii 座山峰建一个高度为 pp 的灯塔,它能照亮第 jj 座山峰当且仅当:

    hjhi+pijh_j \le h_i + p - \sqrt{|i-j|}

    要求对每座山峰 ii,求能照亮所有其他山峰的最小灯塔高度 pip_i


    问题转化

    由条件:

    hjhi+piijh_j \le h_i + p_i - \sqrt{|i-j|}

    可得:

    pihj+ijhip_i \ge h_j + \sqrt{|i-j|} - h_i

    因此:

    $$p_i = \max_{1 \le j \le N} \left( h_j + \sqrt{|i-j|} \right) - h_i $$

    直接暴力的问题

    直接对每个 ii 枚举 jjO(N2)O(N^2) 的,N105N \le 10^5 会超时。


    优化思路

    定义:

    $$f(i) = \max_{j=1}^N \left( h_j + \sqrt{|i-j|} \right) $$

    那么 pi=f(i)hip_i = \lceil f(i) - h_i \rceil(因为 pip_i 是非负整数,样例是向上取整)。


    决策单调性

    考虑函数 w(j,i)=hj+ijw(j,i) = h_j + \sqrt{|i-j|}
    对于固定的 jjw(j,i)w(j,i)ij|i-j| 增大而缓慢增加(x\sqrt{x} 增长越来越慢)。
    这种形式的函数具有决策单调性
    即,如果定义 opt(i)opt(i) 是使 w(j,i)w(j,i) 最大的 jj,那么 opt(i)opt(i) 随着 ii 增大而单调不减。


    分治解法

    我们可以用 分治优化 DP 的方法计算 f(i)f(i)

    1. 先考虑 jij \le i 的部分:
      $g_1(i) = \max_{j \le i} \left( h_j + \sqrt{i-j} \right)$
    2. 再考虑 jij \ge i 的部分:
      $g_2(i) = \max_{j \ge i} \left( h_j + \sqrt{j-i} \right)$
    3. 最后 f(i)=max(g1(i),g2(i))f(i) = \max(g_1(i), g_2(i))

    这两部分是对称的,可以用同样的分治方法解决。


    分治过程

    对于 g1g_1

    • 定义 solve(l, r, L, R) 表示计算区间 [l,r][l, r]g1g_1,已知最优决策点在 [L,R][L, R]
    • mid=(l+r)/2mid = (l+r)/2,在 [L,min(R,mid)][L, \min(R, mid)] 中找到最优决策点 kk
    • 递归 solve(l, mid-1, L, k)solve(mid+1, r, k, R)

    同理处理 g2g_2(方向相反)。


    复杂度

    每层分治扫描的总长度是 O(N)O(N),共 O(logN)O(\log N) 层,所以总复杂度 O(NlogN)O(N \log N)


    • 1

    信息

    ID
    4779
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者