T5
可以发现是一道单调栈,因为单调栈实际上维护的就是后缀最大值的下标,满足单调递减,知道了这一点就是单调栈模板题了。还有,当一个数被pop掉的时候还需要在异或一次以消除他对整个序列的贡献。
T6
考虑贪+dp,到一条边的时候,显然以端点作为起点最优。
dp[i][0/1]:
走到第i条边的左/右端点的最短距离。
答案显然是:
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[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[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上面的位置,在加上整条线段的长度。