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 @ 2024-07-30 14:59  KK_SpongeBob  阅读(7)  评论(0)    收藏  举报  来源