• WQS二分


    WQS二分

    是一种常用于降维的手段

    如果题目中要求选择某种物品数量恰好为(k),我们可以通过(WQS)二分加维护最优解选择物品数量的方式降低时间和空间复杂度

    以例题来讲解

    例题

    [APIO/CTSC 2007]数据备份

    zhoutb2333太强辣

    一般解法是反悔贪心,今天不讲

    显然的性质,每个建筑肯定和自己相邻的建筑连线

    那么设计一个比较暴力的(dp)状态(f[i][j][0/1])表示前(i)个建筑连了(j)条线,当前建筑有没有和上一个建筑连线

    转移很好想

    (f[i][j][0]=min(f[i-1][j][0],f[i-1][j][1]))

    (f[i][j][1]=f[i-1][j-1][0]+pos[i]-pos[i-1])

    我们发现空间不够

    我们设(h[x]=min(f[n][x][0],f[n][x][1])),即选(x)条线段时的答案

    我们将((x,h[x]))在二维数轴上描出来,会发现是一个斜率递增的下凸壳(因为靠前选的线段肯定是最短的,后面加的线段会越来越长)

    考虑某个点((x,h[x])),被一条斜率为(k)的直线相切,那么如果整个函数减去横坐标乘(k),这个点一定是整个函数中最靠下的

    感性理解,前面点斜率小于(k),而后面的点斜率大于(k)

    所以此时我们只要单纯的求函数最低点的答案

    但是我们不知道(k)点处的斜率

    不过我们知道斜率是单调的

    那么我们考虑二分,每次算出最优解的同时算出最优解连了多少条线段

    小于(k)就把斜率变大,大于(k)就把斜率变小

    复杂度(O(nlogn))级别

  • 相关阅读:
    MySQL学习笔记
    为什么使用多态?实现多态的有哪些方式
    C++中派生类使用基类成员的问题
    实现Modbus ASCII多主站应用
    PHP第四天 函数引用传值
    Webpack 快速上手(下)
    Java---23种设计模式(九)------组合模式
    【笔记】Linux就该这么学-第六课第四章
    Node.js HTTPS
    Node.js Smalloc
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12611943.html
Copyright © 2020-2023  润新知