Educational Codeforces Round 147 (Rated for Div. 2)

发布时间 2023-04-24 19:04:50作者: 努力的德华

题目链接

B

核心思路

真的需要加强了,看到这个最大值和最小值我们其实也需要往对应的最大值和最小值的相关操作去想,不如前缀最小值/前缀最大值或者是后缀最小值/后缀最大值。

这里一个比较直接的想法就是想找到不同的地方,然后看不可以扩展。那么怎么看是否可以扩展呢,如果是左边的话,就看当前的位置是不是小于区间最小值,如果小于那么就不会当前位置加入之后这个位置还是不会改变,所以就可以向左边扩展。右边也是这样子扩展就好了。

最后看下区间的长度就好了。

C

我们可以想一下为什么需要设立一个这样子的操作呢。也就是挖掘操作的性质,举一个例子吧:不如\(absdefaeiawxja\).我们假设最后删除得只剩下一个a,那么其实我们需要删除最长的a与a之间的段其他的自然也就是会删除了。因为只要不相邻就都可以删除了。

而像我们中间的段我们每次其实都是可以删除一半的,所以我们可以预处理出来f数组就好了。

总的思路就是先找到最后删得剩下哪一个字母,然后需要最大的段就好了。然后答案就是26个英文字母取min。

需要注意的是我们删除的边界比如\(asdwokf\).所以我们需要将-1插入开头和n(表示的字符串的长度)插入末尾。

D

首先我们需要明白的是最终的答案之和两个因素有关:

  1. 我们最后所在的位置
  2. 我们染色的段。

如果我们染色到某一个段发现,这个加上这个段的长度之后大于我们需要染色的个数。那么我们就需要思考我们需要替换掉前面的哪一些段呢,假设我们再走x步去替换掉前面长为x的段。那么我们知道我们节省下来的贡献就是\(2-x\).很显然只有x=1的时候我们才是最优的。所以结论就是替换掉前面长度为1的染色的段。

然后整个题目也就解决了。

代码实现画一个图就好了,别忘记加上前面的已经染色的格子的额外代价,就是每染色一次都需要花费2的额外代价。