Atcoder Grand Contest 048 题解

A. atcoder < S

题意

可以先判断字典序,如果大于 atcoder\text{atcoder} 直接输出 00 就好。

否则从前向后贪心找第一个字典序大于 aa 的位置,换到前面就好。

注意:如果这个位置大于 tt 那么可以换到第二位。

B. Bracket Score

题意

我们可以先假定所有括号都是圆括号,那么价值就是 a\sum a

考虑把其中一些括号换成方括号,由于要括号匹配,所有我们肯定一次换两个。

稍微思考可以发现,这两个括号一定一个处于奇数位置,一个偶数位置。

因为合法的括号序列中间元素个数一定是偶数。

那么我们可以把 bab-a 作为权值分奇偶排序,每次贪心取最前面的就可以,<0<0 停止。

C.Peguin Skating

题意

我们考虑操作的实质:合并两个段。

若向右移动第 ii 只企鹅,那么相当于合并了 ai+1ai1a_{i+1}-a_i-1 这个长度。

那么向左就是合并 aiai11a_i-a_{i-1}-1

考虑到结束状态的 bibi11b_i-b_{i-1}-1 是由若干个上面的 aa 合并而来,那么问题就转化为了用最少的代价合并出 bb

我们考虑每一个非0的 bibi11b_i-b_{i-1}-1,每次按顺序选择一个刚好和为它的一个连续区间。这样做一定是正确且最优的。

那么上述操作可以用双指针轻松实现。

注意:每次选取 aiai11a_i-a_{i-1}-1 时,要考虑非0的一段,若起始为 00 就要往后缩,保证步数最小。

D.Pocky Game

题意

首先先发现一个性质:一个人只有取完一堆和取一个两种操作。

这分别对应了取完和不取完的情况,而不取完的情况里,只取一个的情况可以转移到其他所有情况,一定不劣于其他选择。

类似 ZJOI取石子游戏,我们可以考虑dp求解。

L[i][j]L[i][j] 表示考虑 [i,j][i,j] 这个区间内,ala_l 至少取什么值能够保证 LeftLeft 先手必胜。

类似的 ,R[i][j]R[i][j] 表示考虑 [i,j][i,j] 这个区间内,ara_r 至少取什么值能够保证 RightRight 先手必胜。

我们考虑 L[i][j]L[i][j] 的转移:

  • R[i+1][j]>ajR[i+1][j]>a_j 时,该状态若 RightRight 先手,无论怎么取必败。我们只需要取完 aia_i 即可,即最少 L[i][j]=1L[i][j]=1
  • R[i+1][j]ajR[i+1][j]\leqslant a_j 时,左右两边的人一定是慢慢取,一个一个取。

如果有人取的 >1>1,那么它的消耗速度会大于另外一个人,更早接近边界。

这里的 "边界" 即指 L[i][j1]L[i][j-1]R[i+1][j]R[i+1][j],如果有人剩下的石子小于边界的话,那么剩下的一个人直接将 aia_iaja_j 取完,变为 [i,j1][i,j-1][i+1,j][i+1,j],这样另一个人就会必败。

所以两人取到边界的时间分别为 aiL[i][j1]a_i-L[i][j-1]arR[i+1][j]a_r-R[i+1][j],若要左边必胜,则需在 RightRight 取过边界时,左边还未取过,即:

aiL[i][j1]ajR[i+1][j]+1a_i-L[i][j-1]\geqslant a_j-R[i+1][j]+1

移项,得:

L[i][j]=ajR[i+1][j]+L[i][j1]+1L[i][j]= a_j-R[i+1][j]+L[i][j-1]+1

R[i][j]R[i][j] 转移类似,总复杂度 O(Tn2)O(Tn^2),记忆化搜索实现。