P9691 [GDCPC2023] Base Station Construction 题解
P9691 [GDCPC2023] Base Station Construction 题解
题意
给定一个长度为
分析
设状态
我们可以把
转移类似这样:
其中,转移需要满足
所以完整转移为:
然后求
两个式子分别可以用单调队列优化
代码
void Main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
a[++n]=0;
for(int i=1;i<=n;i++)pre[i]=0;
m=read();
for(int i=1;i<=m;i++){
int l=read(),r=read();
pre[r+1]=max(pre[r+1],l);
}
pre[1]=0;
for(int i=2;i<=n;i++)pre[i]=max(pre[i],pre[i-1]);
l=1,r=0;q[++r]=0;
for(int i=1;i<=n;i++){
while(l<=r&&q[l]<pre[i])l++;
f[i]=f[q[l]]+a[i];
while(l<=r&&f[q[r]]>=f[i])r--;
q[++r]=i;
}
printf("%lld\n",f[n]);
return;
}