因为比较菜,这次多校只负责了一个题的出题,2020HDU Multi-University 5 1007 Tree(现已挂到hdu6820),出题总结之前因为考试咕了很久。
题目构思
这道题idea基本就是想着要出树形dp,所以构思了很久就想出了这道题。本来的题目是要求子树所有的点度都小于(k),但原来的题目转移方程很好写,基本10分钟左右就写好了,毕竟是多校,难度还是要加强,后来想了很久,有了现在的版本,题目改为了度数超过(k)的至多一个点,其余都小于(k),这样一来转移方程难写不少,需要维护的内容也多了有一个点度大于(k)的部分,难度算是加强了不少。
关于题解
感谢fblogy学长,虽然已经保研北大,但还是帮助我check过了我题目的解法,确认无误,我才敢出的题。同时也祝fb学长研究生阶段能够顺利。感谢Edwardwsb帮我进行了验题。
关于题面
原先的题目表述和实际题目也不一样,原来的描述是要求子树能够找到一个点作为根节点,使得树上所有点儿子数量都小于(k-1),这样等价于度数度数小于(k),转化为下现在的题目描述。原来题面描述方法其实是为了骗大家去写换根,找一个子树,根节点任取,题目描述就很换根,随后被学长要求将题面描述改为现在的版本,不绕圈子了,因为学长说这结论很显然,骗不到大家,不会有队伍写换根的。而比赛时,即使是现在的题目描述版本,很多队伍也都写了换根。关于到底是原先的描述还是现在描述更好估计也很难说,不可能再办一场看大家怎么做题了,效果也不好说。另外就是比赛时有队伍提问了度究竟是算子图还是原图,这部分后来我看了下描述的确实不够清楚,题面有点小瑕疵。
关于换根做法
在出题的时候是有考虑的换根做法的,但当时我想到底换根做法和现场很多队伍的都不太一样,我是用来维护原来维护最终题解所说的某个点不和其父节点连接的情况,即这个点和它的(k)个儿子直接相连情况,当时考虑了下好像也没什么办法卡掉,而且感觉维护起来也比树形dp难,觉得没什么卡的必要,就没怎么管。
而实际比赛,结束后问了前队友,说是换根枚举那个度超过(k)的节点,那这种做法最后其实只需要一维(dp)就行了除了换根稍微麻烦一点,这个做法(dp)转移方程好写得多,而且也很好想。关于这种换根做法,结束后想了下其实是可以卡掉的,把不超过一个改成(2)个就行了,就没办法枚举这个点了,虽然相应地树形(dp)也会更难写,但我觉得卡掉换根可能会更好。当时想了换根但和实际很多队伍换根做法不一样,感觉有点锅,在对于题解之外的做法考虑不够全面。
出数据
这道题数据还是比较好出的,菊花图,长链都出了几组,边长随机数据基本就足够强了,然后对于并查集维护的贪心做法也进行check,确保过不了,复杂度的话考虑了下其实标程可以写到(nlogk),用堆维护,但想了下(nlogn)更好写,况且(k)本来就可以达到(n)的大小,优化差距不大,就没有这么写,直接写了排序。
关于比赛
开赛大概10分钟左右就有队伍开这题了,还是预料之中的,但是最后的通过率是我没想到的,(120/1174),(只有10.22\%),尤其终榜rank1的杭州市第二中学team0368一共8发错误提交。在30分钟之前,看着0/27的提交,我已经做好了被挂上知乎喷的准备,开始怀疑人生,毕竟北大,清华,杭州第二中学等强队提交全部错误让我以为我数据错了。但是,好在30分钟时候北大AC终于让我吃了定心丸。