7.30考总

T5

可以发现是一道单调栈,因为单调栈实际上维护的就是后缀最大值的下标,满足单调递减,知道了这一点就是单调栈模板题了。还有,当一个数被pop掉的时候还需要在异或一次以消除他对整个序列的贡献。

T6

考虑贪+dp,到一条边的时候,显然以端点作为起点最优。

dp[i][0/1]: 走到第i条边的左/右端点的最短距离。

答案显然是:

min( dp[ n ][ 0 ]+na[ n ].x,dp[ n ][ 1 ]+na[ n ].y )\min(\ dp[\ n\ ][\ 0\ ]+n-a[\ n\ ].x,dp[\ n\ ][\ 1\ ]+n-a[\ n\ ].y\ )

dp初始值设置:

dp[1][0]=a[1].y+a[1].y-a[1].x-1;//要先走完线段在回来

dp[1][1]=a[1].y-1 //1~y的区间

方程:

dp[i][1]=min(dp[i1][0]+abs(a[i1].xa[i].x)+a[i].ya[i].x+1,dp[i1][1]+abs(a[i1].ya[i].x)+a[i].ya[i].x+1);dp[i][1]=min( dp[i-1][0]+abs(a[i-1].x-a[i].x)+a[i].y-a[i].x+1, dp[i-1][1]+abs(a[i-1].y-a[i].x)+a[i].y-a[i].x+1);

从上一条线段的左/右端点走过来,要先走到a[i].x上面的位置,在加上整条线段的长度。

dp[i][0]=min(dp[i1][0]+abs(a[i1].xa[i].y)+a[i].ya[i].x+1,dp[i1][1]+abs(a[i1].ya[i].y)+a[i].ya[i].x+1);从上一条线段的左/右端点走过来,要先走到a[i].y上面的位置,在加上整条线段的长度。 dp[i][0]=min( dp[i-1][0]+abs(a[i-1].x-a[i].y)+a[i].y-a[i].x+1, dp[i-1][1]+abs(a[i-1].y-a[i].y)+a[i].y-a[i].x+1);从上一条线段的左/右端点走过来,要先走到a[i].y上面的位置,在加上整条线段的长度。
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示