Placing Medals on a Binary Tree

https://vjudge.net/contest/175792#problem/G

题意:有一颗完全二叉树,深度从0至1e9,给出n个数字,分别代表把金属加到深度为a[n]的一个结点上,要求每个放有金属的结点,其通往根节点的路径上的所有结点,都不放有金属,依次放入n个金属,如果能成功放入,输出Yes,否则输出No。每次放金属都以最佳方案放置,比如尽可能放在左边,以能放置更多的结点。

 

做法:举个例子,放置了2之后,这颗树就不能再放置其他东西了,如果有放置了2个2,则以他们共同的父亲为根节点的子数都不能再放置东西,即2 + 2 = 1。以此向上推,当放入一个数使得出现0,此时还有比0大的数,则不能放置。而且,出现0之后,往后不能放置任何东西了。假设输入为4 4 4 4 4 4 4 4 1 4,则相当于(4),(3),(3,4),(2),(2,4),(2,3),(2,3,4),(1),(0),最后一个不能放。假设输入为2,3,1,1,4,2,则相当于(2),(2,3),(2,3,1),不能放,(2,3,1,4),不能放。

用set存放当前存在的数字(不会出现重复的数字,否则可以向上推),len表示从1开始连续存在到最大的那个数,maxn存当前集合中最大的数,当此时输入的数n小于等于len时,说明该数可以一直加到0,如果此时集合中有大于n的数,则它不能被合并,那么0的出现就是不合法的。如果集合中没有大于n的数,则可以合并所有的数,最后变为0。当输入n时集合中有0,则不能放置n。当n比len大,且在集合中存在时,则一直向上合并,最多能合并到len+1(最大连续长度为len,说明本身一定不存在len+1),合并的同时消除掉原本的那个数。如果集合中不存在n,则直接插入。记得更新maxn。

posted @ 2017-08-02 20:19  Sissi_hss  阅读(499)  评论(0编辑  收藏  举报