zoukankan      html  css  js  c++  java
  • LA 4726 再看斜率优化

    感觉最近一批解题报告没写,现在慢慢补吧,算是noip前攒攒rp了

    首先感到深深的自责,因为之前对斜率优化没有深入的理解,只是记住了一般步骤,并没有完全了解为什么这样做

    先就这道题目而言

    首先这种序列题不难想到用前缀和的思想搞

    顺着扫描每个点i,对于以它结尾的序列最大平均值,我们就是要找一个j,使得s[i]-s[j]/i-j最大 i-j>=L

    设状态k,j都满足条件,k>j,如果

    s[i]-s[j]/(i-j)<=s[i]-s[k]/(i-k) 

    一开始我还SB想化成原来做斜率优化题目的方法做,后来我看了《浅谈数形结合思想在信息学竞赛中的应用》

    发现自己就是太弱了,斜率优化的本质其实就是数形结合

    这个式子已经是斜率,之所以之前的题目辛辛苦苦的化就是要弄出斜率………………

    至于这道题剩下的说明《浅谈数形结合思想在信息学竞赛中的应用》讲的非常详细,不再赘述

    看这篇论文,回头想想,我才明白之前做斜率优化的原理,以之前的poj1180为例(http://hi.baidu.com/phile99/item/ce87b31beb2d1c0c8ebde4b0自我传送)

    到了这里(w[k]-w[j])/(f[k]-f[j])>=1/(t[i]+c)

    设A[i]=1/(t[i]+c);

    于是我们得到了一些点Pk,Pj,他们的坐标(f[j],w[j])

    之前的报告中我们已经证明了下凸线一定会被删去(即对于k<j<i,G(i,j)>G(j,k) j一定不是最优,G就相当于斜率

    实际上下面我们要维护一个上凸线的过程(其实仔细琢磨和凸包很像)

    这里我们之所以用单调队列来维护是基于一个条件,A[i]是单调函数

    拿这道题为例,对于状态i,当G(k,j)>=A[i],k一定比j优,从而不考虑j

    对于以后的i,A[i]是单调减函数,那么同样的G(k,j)一定也>=A[i]也就说j以后都不用在考虑了

    在这种情况下,我们才敢用单调队列维护两点的斜率,才保证了每个点入队一次且被删除一次

    如果A[i]不是单调的呢?由于还没有做过这样的题见到再说吧,求指教

  • 相关阅读:
    Effective Java第三版(一) ——用静态工厂代替构造器
    联合主键下的mapper文件对数据库的批量更新
    dart的基本语法(一)
    单例模式
    给hexo博客的NEXT主题添加一个云日历
    使用nginx+tomcat实现动静分离
    nginx(二)
    nginx(一)
    初识Nginx
    给hexo添加宠物
  • 原文地址:https://www.cnblogs.com/phile/p/4473107.html
Copyright © 2011-2022 走看看