• arc063f


    按照题意设f[i]表示前i个点的最大收益,g[i]表示后i个点的最大收益。

    显然:

    f[i]=max(f[i-1],f[j]+frac{(i-j)(i-j+1)}{2}-s[i]+s[j])

    拆开括号变成f[i]=max(f[i-1],f[j]+frac{i*2-2*ij+i-+j^2-j}{2}-s[i]+s[j])

    把斜率设成ij,容易发现是个斜率优化的标准形式,使用栈维护半平面交。

    g同理可得也可以斜率优化。

    设第i个点不变时的收益为h[i],则转移方程枚举包含i的极大区间,得到:

    h[i]=max(f[l]+g[r+1]+frac{(i-j)(i-j+1)}{2}-s[r]+s[l])

    考虑分治,设当前区间为[l,r],中点为md。

    设p[i]表示以i为左端点,右端点的范围为(md,r]的最大收益。

    则p[i+1]=max(f[i]+g[j+1]+frac{(i-j)(i-j+1)}{2}-s[j]+s[i])(j=mid+1~r)

    拆开括号,变成p[i+1]=max(f[i]+g[j+1]+frac{i*2-2*ij+i-+j^2-j}{2}-s[j]+s[i])(j=mid+1~r)

    也是个标准的斜率优化形式,使用栈维护半平面交。

    实际上,p[i]可以被它包含的h(感受一下),反之h[i]可以被p[l]...p[i]更新。

    所以应该从小到大做。

    设q[i]表示以i为右端点,左端点的范围为[l,md]的最大收益。

    转移也类似。

    综上所述,枚举当前点x是否选择,则答案为max(f[x-1]+g[x+1],h[x]+y[x]-y)

    y为当前点权值。

  • 相关阅读:
    onTouchEvent的参数详解
    test
    List泛型自定义排序
    unity3d camera.culling mask
    云计算实验一
    软件设计——职责链模式之审批处理
    sqlserver配置sa用户
    软件设计——模板方法模式之对数据库的操作
    flask入门
    课程总结+申请加分
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/13047604.html
Copyright © 2020-2023  润新知