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到这个区间的右端点的右邻点。

 

posted @ 2021-03-13 09:08  AngelKnows  阅读(83)  评论(0)    收藏  举报