CF1495F Squares
假设只有一次询问,给了一个集合S,求最小代价。
如果我们把pi想象成点i的高度。
那么我们除了第一个操作:走到下一个相邻点,还有一个操作:跳到右边第一个高于它的点上。
如果S中有两个点i和j,i<j,且pi>pj,那么我们走到i后,必然是一直相邻走法走到j。
如果pi<pj,那么也可以进行第二种操作。这取决于,代价的比较。
这样DP就行了。
设S中有m个元素,序号从小到大分别是s1,..,sm
dp[M], dp[i]表示走到si点且s1,...,s(i-1)全走过的最小代价,注意我们的ans!=dp[m],因为round结束条件是走出棋盘。
dp[i]=dp[i-1]+sum_a(s[i]-1)-sum_a(s[i-1]-1)
if (p[s[i-1]]<p[s[i]]) dp[i]=min(dp[i], dp[s[i-1]]+b[s[i-1]]+sum_a(s[i]-1)-sum_a(jump(s[i-1])-1)
问题是,这个dp怎么动态维护。
这种题没做过。
看了题解,我们可以把i和j的关系用边来表示,从而建图。
jump,不同的点可能jump到同一个点,我们可以把这些点分为一类讨论。
对于一个点j,它的fa定义为它左边第一个点i使得pi>pj,
那么i+1~j-1中的点,都是>pj的,因此jump后都会达到j
这样可以得到一个树。这个树有啥性质?
对于点i,它的子树节点(除它外)都<pi,因此i jump一定跳过它的子树
事实上,它的子树对应的是一段连续的区间,并且i jump到这个区间的右端点的右邻点。

浙公网安备 33010602011771号