定义序列函数 $f(x)$ :所有满足 $x_i>x_{1\cdots i-1}$
组成的序列。如 $f[3,1,2,7,7,3,6,7,8]=[3,7,8]$
给出三个序列 $a,p,b$ ,删除 $a_i$的代价为 $p_i$($p_i$可能为负)。求使 $f(a)=b$ 的最小代价。无解输出$NO$。
一切都要从简单开始,可以考虑$b[i]->b[i+1]$这么转移。
枚举$i=1..m$。设$dp[pos[b[i]]]$表示若选中需要的删除的数字最小值。
显然枚举所有$dp[pos[b[i-1]]$转移过来。为了表示清楚,我设$r$为某个$b[i]$的位置。$l$为$b[i-1]$的某个位置则
$dp[r]=dp[l]+sum(l,r,v\geq b[i-1] \ or \ p[i]<0)$
观察到这一步因为$b[i]$单调,所有可以每次删去一部分$<b[i-1]$,然后树状数组查询。但是这样会$TLE$
因为对于每个状态$dp[pos[b[i]]]$需要重复枚举。由于$pos[b[i]]$是单调增的,并且满足要求的$pos[b[i-1]]$也随之增多,这里可以单调判断。考虑$dp[pos[b[i]][j]]=dp[pos[b[i]][j-1]]+sum(pos[b[i]][j-1]],pos[b[i]][j]],v\geq b[i-1] \ or \ p[i]<0)$。直接转移即可。
- 注意转移边界开闭
- 注意启始的状态边界
代码
1 |
|