luogu(2022.7~2022.11)

1973(DP,双指针)

注意:题目中的区间 \((l,r)\) 是开区间!

\(pre(i,j)\) 表示前 \(i\) 个位置,某个地点选了 \(j\) 个活动,另一个地点所能选的活动数量的最大值。

\(suf(i,j)\) 表示后 \(i\) 个位置,某个地点选了 \(j\) 个活动,另一个地点所能选的活动数量的最大值。

\(w(i,j)\) 表示区间 \(i\)\(j\) 的活动数量。

\[pre(i,j)=\max_{k<i}\{pre(k,j)+w(k,i),pre(k,j-w(k,i))\} \]

\[suf(i,j)=\max_{k>i}\{suf(k,j)+w(i,k),suf(k,j-w(i,k))\} \]

\(tot\) 为离散化后时间序列的长度,第一问的答案为

\[\max_{i=0}^{n}\min(i,pre(tot,i)) \]

\(f(l,r)\) 表示钦定某个地点钦定选择 \((l,r)\) 区间里的所有活动,两个地点最小活动的最大值

\[f(l,r)=\max_{0\leq x\leq n,0\leq y\leq n}\min(x+y+w(l,r),pre(l,x)+suf(r,y)) \]

但是有可能存在跨越端点的活动,因此

\[ans(l,r)=\max_{x\leq l,y\geq r}f(x,y) \]

需要预处理出所有的 \(f(l,r)\),暴力处理复杂度是 \(\mathcal{O}(n^4)\),考虑优化。

发现如果把 \(pre(i,j)\)\(suf(i,j)\) 的定义都改成至少选 \(j\) 个对最后 \(f(l,r)\) 计算没有影响。

改了之后就 \(x\) 增大时 \(y\) 就一定不增了,这样就优化到了 \(\mathcal{O}(n^3)\)

posted @ 2022-12-24 09:13  top_tree  阅读(107)  评论(0)    收藏  举报