T1:因为一棵树有n-1条边,所以我们可以从这里下手。
首先,特判n=1的情况,然后把所有点的度加起来在除以2,求出来的就是边数,而这个数如果等于n-1的话这就可能是一棵树,若不等于则这一定不是一棵树。
T2:首先从小到大排序,然后二分答案。
那么怎样判断二分出来的mid是否可行呢?
首先,对于每一个数,在序列中一定有一个以它为左端点的区间,使得区间中max-min不大于mid。
因为已经排好序了,所以这个数一定是区间中的min,并且所有区间的右端点是单调不递减的。我们用单调队列求出每一个点所对应的区间,那么现在问题就转换成了在序列中是否可以选出R组连续的数,每组数有C个数,并且选出来的数既不能重复,每一组数有必须在一个区间中。而又因为区间是不递减的,所以我们可以用贪心的思想,优先选左边的数。看看能选出来多少组,最后和R进行比较就行了。
T3:首先把与金子有关的树建出来,这个可以排一边序,然后公共部分同编号,不同部分新开节点来做。
建好之后,设g[x]表示x的叶儿子节点到x的最大值,f[x]表示要达到这个最大值x要往那个儿子走。显然,g[叶子]=1,f[叶子]=0。
接下来,我们可以求出整棵树的f和g。然后,我们依次放置n个机器人。每放置一个时,这个机器人的价值为g[根],放置完之后我们对f个g进行修改,也就是顺着f走下去,把那个叶子节点删掉,再修改沿路的f和g。这就完成了。