HanoiFactory[CF]
题目链接
题意
汉诺塔由无数个空心圆柱堆积而成。现有$N$个空心圆柱,第$i$个圆柱的内径,外径高分别是$a_i,b_i,h_i$,问这些圆柱最高能堆多高的塔,堆积方式是从下往上:
- 第$x$个的外径$b_x $要大于等于第$x+1$个的外径$b_{x+1}(b_x \ge b_{x+1})$
- 第$x$个的内径$a_x $要小于第$x+1$个的外径$b_{x+1}(a_x \lt b_{x+1})$
题外话
这题的解法并不难,不过有个有意思的trick。
而且这是第一次打CF能够ak。所以随便记录一下.
解法:
可以贪心dp等方式,我用的是线段树.
首先把ab离散化。按b从大到小排序,这样就能保证排序后的第i个圆柱来说,前面i-1个圆柱都满足第一个条件.
然后我们就可以用线段树维护前i-1个中每一个a。能够堆的最高的塔.对于第i个圆柱来说.只要找前面所有的a中小于b的。能够堆得最高的.再加上第i个的高度,就是第i个圆柱能够堆的最高高度了.同时把ai在线段树中更新一下.时间复杂度$O(nlgn)$.
然后有意思的trick来了.这个trick让很多人都wa了至少一次.
当圆柱的b不同的时候,从大到小排序.那么当b相同的时候呢?这里正确的是把a也从大到小排序。因为这样才能让后面能堆得尽量高,有个例子1234543 7 25 7 24 7 24 4 2
这里如果a不从大到小排序,那么对于[3 7 2]这个圆柱来说,最高的是2,后面[4 4 2]的时候只能搭在[3 7 2]上面结果为4.这是不对的。
为当a从大到小排后[3 7 2]可以搭在另外两个上面高度为6.然后[4 4 2]再塔在[3 7 2]上面。结果为8.
|
|
顺便记录下第一次ak截图.