Codeforces Round #629 (Div. 3) 解题报告
A
【题意】签到题
B
【题意】长度为n的字符串,由n-2个a和2个b组成,按照字典序排序,问第k个
【题解】读题细心,最开始以为是ab代表01,搞二进制转化,实际上上面是正确题意,直接算b的位置即可
C
【题意】长度为n的由0,1,2组成的序列,分成两个数字,让他们的最小值最大
【题解】所以我们只需要让他尽量平均分即可,0可以分成0和0,2可以分成1和1,所以我们只有当碰到1的时候开始特殊处理,所以我们把1给一个数,然后下来所有的1和2都分配给另外一个数,以此能够保证分配的平均
D
【题意】给一个长度为n的序列,表示一个由各种类型组成的圆圈,现在问要让两两相邻的种类不同的生物被染成不同颜色最少需要多少颜色
【题解】第一没看见那个图,然后当序列做了一个小时然后剩下10分钟也没想到正解所以GG
贪心,两两不同直接两种颜色交叉1,2,1,2就可以了,但是只有在偶数个的情况下才能成立。如果是奇数的话会导致最后一个和第一个颜色相同,有两种解决方法,一种是如果有两个颜色相同的话可以做一改变,如果没有的话只能添加第三种颜色进行分割。
E
【题意】给定一颗n个结点的树,给定q个序列,每个序列有ki个数,现询问这些数字是否存在一条路径经过这些点或者他们的父亲
【题解】原文是找一条路径,这些点在他上面或者离这条路径上的点距离为1,其实就是这条路径经过这些点或者他们的父亲,在路径上的点的父亲还是在这个路径上,于是这个题就变成了观察这些点是否在一条路径上。
原题是使用的dfs序进行判断点是否为这个序列中最深的结点的父亲来判断是否存在路径,因为dfs序自己就拥有判定父子的能力,而且能够判断两个是否在一条路径上的能力
使用LCA也可以进行判断,如果一个点和最深点的LCA是这个点这个点一定是最深点的父亲,但如果不是的话,判定完两个点的LCA之后应该怎么处理好像还没想明白,囧
F
【题意】一个n个正整数的序列,有两种操作,一种是将最小的数字加1,一种是将最大的数字减1,现求需要获得k个相等的数字最少需要多少操作
【题解】利用前缀和枚举如果要到达每个序列上每个数字所需要的操作,至于为什么是序列上的数我觉得应该是可证的,先把左面的全部移过来,因为如果要获得这个数字前面的所有数字一定是需要全部加完的,右边同理。然后再先把右边移过来,然后把左边移过来。
具体移的过程,先把所有的数字移到val-1处,然后再移对应的本次需要的
总结:贪心还是不大会,坚持补题