按照题意设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为当前点权值。