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为当前点权值。

原文地址:https://www.cnblogs.com/cszmc2004/p/13047604.html