【垫底模拟】CSP-14

发布时间 2023-08-04 15:12:35作者: Sonnety

T1 第负一题

第负一题(×)
地府一题(√)

当时觉得是唯一可做题目,然后伪了。

这道题其实 20pts 很好拿,就是设计 \(f_{i,[0/1]}\) 表示 \(i\) 表示第几轮,\(0/1\) 表示取或不取:

\[ \begin{aligned} &f_{i,1}=f_{i-1,0}+a_i\\ &f_{i,0}=max(f_{i-1,0},f_{i-1,1}) \end{aligned} \]

然后这个是 \(O(n)\) 的,套上枚举的长度和起点就是 \(O(n^3)\)

然后考虑分治(?怎么想到分治的?)以中点 \(mid\) 分界,设:

  • \(lf_{i,[0/1],[0/1]}\) 表示现在到第 \(i\) 轮,第一个 \(0/1\) 表示是否选 \(mid\),第二个 \(0/1\) 表示是否选择第 \(i\) 个元素。

  • \(rf_{i,[0/1],[0/1]}\) 表示现在到第 \(i\) 轮,第一个 \(0/1\) 表示是否选 \(mid+1\),第二个 \(0/1\) 表示是否选择第 \(i\) 个元素。

为了简单表示,我们这样写:

  • \(lg_{i,[0/1]}\) 是向左,\(1\) 表示选 \(mid\)\(0\) 表示不选 \(mid\) 的最大值,即 \(max(lf_{i,[0/1],0},lf_{i,[0/1],1})\)

  • \(rg_{i,[0/1]}\) 是向右,\(1\) 表示选 \(mid+1\)\(0\) 表示不选 \(mid+1\) 的最大值,即 \(max(rf_{i,[0/1],0},rf_{i,[0/1],1})\)

对于区间 \([l,r]\),因此就有:

对于 \(lg\)\(rg\),第二维的 \([0,1]\) 只可能是 \((0,0)\)\((0,1)\)\((1,0)\),因为 \(mid\)\(mid+1\) 相邻。

即:

\[ \begin{aligned} \sum_{i=l}^{mid}\limits \sum_{j=mid+1}^{r}\limits max(lg_{i,0}+rg_{j,1},lg_{i,1}+rg_{j,0},lg_{i,0}+rg_{j,0}) \end{aligned} \]

然后我们发现 \(max()\) 这里面三种方案 \((0,0),(0,1),(1,0)\) 都与 \((0,0)\) 存在交集。

然后对他进行一个优雅的转化:

\[ \begin{aligned} &max(lg_{i,0}+rg_{j,1},lg_{i,1}+rg_{j,0},lg_{i,0}+rg_{j,0})=\\ &max(lg_{i,1}-lg_{i,0},rg_{j,1}-rg_{j,0},0)+lg_{i,0}+rg_{j,0} \end{aligned} \]

于是现在我们设 \(fl_i=max(lg_{i,1}-lg_{i,0},0),fr_i=max(rg_{i,1}-rg_{i,0},0)\),原本的式子就被转化:

\[ \begin{aligned} \sum_{i=l}^{mid}\limits \sum_{j=mid+1}^{r}\limits (max(fl_i,fr_j)+lg_{i,0}+rg_{j,0}) \end{aligned} \]

如何实现代码?

不会求教。