ABC309CDE题解
C:统计一开始每天所需吃的药片数,将每种药按照吃的天数排序。
按照排序后的顺序减去药片数,记录当前枚举到的天数和目前所需吃的药片数。
药片数小于等于k时弹出循环,输出。
*cmp函数不要用<=或>=
D:原先有两个连通块,添加一条边并不影响两个连通块内部的最短路。
=》考虑分别找出两个连通块的最大最短路,即对于每个连通块,算出初始点到每个点的最短路后找出最大的两个点。 将两个最大点的值相加再加1得到ans。
因为边权为1所以直接bfs。
*第二个连通块的初始点是n1+n2
E:考虑按照父子关系构建一棵树。在这里因为所有的保险是向下覆盖的,因此存储每个节点的son。
由于每次购买保险后就进行树的覆盖会tle,因此考虑将每个节点的保险数做上标记,在打完标记后统一遍历树。对于每个标记,取最大值。
遍历树时,下传标记为当前[max(父节点传来的标记,本身标记) - 1]。
*保险输入时第二个参数是指覆盖下面的代数,要加1(加上本身)
*标记只用来判断是否需要ans++,无论如何整棵树都需要被遍历一次,因此不能写tag!=0才往下执行