反思汇总(倒续更新

  有生之年系列  

csp-s模拟测试50 2019-09-22


T1数组脑残开小炸掉20,T2暴力达到标准暴力分,T3无脑$n^5$暴力拿到20(c n m 以暴力为生

T2至今未改过来,(毕竟我是分块控稍微抵制莫队 但是优雅暴力一家亲啊喂 听说莫队都不用分块的,先咕着明天改

 A. 施工

   主要是证明那个填平不会......

  $f[i]$表示考虑到$i$并且$i$这个位置高度不变的最小代价

  那么转移方程就很好写了    $f[i]=\sum_{k=j+1}^{i-1}(t-h_k)^{2}+c*(h_j+h_i-2*t)+f[j]$

  但是有一个细节   答案不是$f[n]$ 你需要在左右放上一个无高的假想柱子 最后求$f[n+1]$

  表示$i$从$j$转移过来,我们想什么样的$j$可以转移到$i$

  一定是$j<=i$ 并且对于任意的$j+1<=k<=i-1$ 都有$h[k]<=h[i]$  $and$  $h[k]<=h[j]$

  (显然啊因为你要把 $i,j$ 之间的全都往上填

  我们再想 如何维护可以转移的 $j$ 的集合   我们发现如果枚举的话会使复杂度“优化”到$O(n^2)$

  于是我们颓完题解选择了单调栈

  想想为什么要用单调栈

  

  我们维护一个单调递减的单调栈   $l$,$j$,$k$是单调栈里的元素(单调栈存原序列下标就好

  那么这个单调栈的实际含义为  在$l$,$j$之间没有比$h[l]$,$h[j]$大的元素

  那么意思就是你的 $l$,$j$可以转移给$i$

  并且当$i$入栈  它顶掉的(如本图中的$j$,$k$)一定不会转移给$i$后面的元素

  其实很显然 记$i$后有一个$r$需要被更新 记转移点为$pos$那么必须满足上文说的

  在$l$,$j$之间没有比$h[l]$,$h[j]$大的元素

  在这儿也同理 在$pos$,$r$之间也不应该有比$h[pos]$,$h[r]$大的元素

  那么我们想 被$i$顶掉的$k$显然不可能作为转移点 因为$k$和$r$之间有一个$i$使得$k$不可能作为$pos$

  这是单调栈的优秀性和正确性(删除了没必要的转移点,并且删除的操作是对的

  单调栈维护的转移点讨论完了,我们思考转移

  我们想应该怎么转移   以一个$j$转移给$i$为例

  我们要做的 是把$j+1$到$i-1$之间的填平

  想数组含义  这一定是$j$,$i$不动  那么就可以代价分为到达 $j$且$j$不动的最小代价$f[j]$和填平$j+1$到$i-1$的代价

  即转移方程的由来     $f[i]=\sum_{k=j+1}^{i-1}(t-h_k)^{2}+c*(h_j+h_i-2*t)+f[j]$

   现在我们要做的是求一个$t$使结果最优 显然是一个二次函数的形式

  假设我们拥有了二次函数的最低点对应的$t$

  我们想即便是高考数学上你也要保证自变量$t$符合实际情况

  那么我们的$t$呢

  一定要比$h[i]$,$h[j]$小 并且比$max(h[k])$,$j+1<=k<=i-1$大

  即对于求出来的最优(不一定符合实际)的$t$设限制

  显然最后对于$h[i]$,$h[j]$取$min$,对于$max(h[k])$取$max$就好

  $h[i]$,$h[j]$已知,那$max(h[k])$呢?

  想想单调栈 记栈顶为$top$

  显然$i$和$top-1$之间的最大值是$h[top]$

  所以可以每次在弹栈前进行修改

  以$top-1$为$j$,$h[top]$为$max(h[k])$更新答案    然后把$top$弹走  这时我们是不用考虑$top-1$的

  

  关于$t$的求法   就是二次函数最低点$-b/2a$

  把原始方程化为$a*t^2+b*t+c$的形式 求出$t$ 并如上设限带入求值就好

   $t=-\tfrac{b}{2a}=\tfrac{\sum_{k=j+1}^{i-1}h_k+c}{(i-1-j)}$

  注意边界问题 在我们假象的柱子上是不用付出代价的(比如你当前要转移到$n+1$  把之前的填为$t$ 是不需要付出$(h[n+1]-t)*c$的代价的)

  大体就是这样 但是证明为什么是平的我只能YY


 B. 蔬菜

  我正在打莫队


 C. 联盟

  $O(n^5)$暴力有人听吗?


猜你喜欢

转载自www.cnblogs.com/bilibiliSmily/p/11569469.html