题解:P11119 [ROI 2024] 保持连接 (Day 2)
Meta_Morph · · 题解
P11119 [ROI 2024] 保持连接 (Day 2)
博客园链接:P11119 [ROI 2024] 保持连接 (Day 2) - Add_Catalyst - 博客园 (cnblogs.com)。
知识点
DP,前缀和。
分析
设
那么设
现在再来考虑
考虑求出经过某个点
那么设经过该区间的点数为
那么考虑如何维护
考虑优化,发现树状数组修改的点也是递增的,那么我们先对于修改和未修改都求出贡献前缀和数组,然后在加入
代码
constexpr int N(1e6+10);
int n,X;
int a[N],L[N],R[N];
ll ans(LINF),sum(0);
ll f[N],g[N],h0[N],h1[N];
signed main() {
#ifdef Plus_Cat
freopen(Plus_Cat ".in","r",stdin),freopen(Plus_Cat ".out","w",stdout);
#endif
I(n,X);
FOR(i,1,n)L[i]=R[i]=i;
FOR(i,1,n) {
I(a[i]);
int l(max(1,i-a[i])),r(min(n,i+a[i]));
tomin(L[r],l),tomax(R[l],r);
}
DOR(i,n,2)tomin(L[i-1],L[i]);
FOR(i,2,n)tomax(R[i],R[i-1]);
DOR(i,n-1,1)g[i]=(n-R[i])+g[R[i]+1],sum+=g[i];
ans=sum;
FOR(i,1,n)f[R[i]+1]+=(++f[i]),h0[i]=h0[i-1]+f[i]*g[i],h1[i]=h1[i-1]+f[i]*(g[i]-g[R[i]+1]),f[i]+=f[i-1];
FOR(i,1,n)if(X>a[i]) {
int l(max(1,i-X)),r(min(n,i+X)),p(i+X<=n?L[i+X]-1:n),q(max(l,L[p]));
if(p<l)continue;
tomin(ans,sum-(h0[p]-h0[q-1])+(f[p]-f[q-1])*(n-r+g[r+1])-(h1[q-1]-h1[l-1]));
}
O(ans,'\n');
return 0;
}