zoukankan      html  css  js  c++  java
  • 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为当前点权值。

  • 相关阅读:
    java第二周的学习知识
    java第一次课
    今天晚上有事,代码假期完成。
    [leetcode] Minimum Path Sum
    java访问权限整理
    java IO整理-File
    java初始化顺序
    enum使用整理
    工厂模式总结
    java IO-流
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/13047604.html
Copyright © 2011-2022 走看看