抓知了

来源:互联网 发布:淘宝 3d打印 编辑:程序博客网 时间:2024/04/27 22:36

题目

深海龙王和水葫芦娃放了暑假闲的无聊,一天他们路过一棵树,听到树上的知了叫的好欢啊∼
深海龙王准备抓几只知了送给水葫芦娃。他发现面前的这棵树是一颗以1 号节点为根节点的一颗有根树,同时他又发现这颗树上的每一个节点i 上都恰好停有一只蝉,正在愉快的以ai 的响声鸣叫∼
深海龙王会从1 号节点起沿着树边一直爬,直到爬到一个叶子节点(请不要在意他怎么下来),在这途中他可以选择一些他经过的蝉并将它们抓起来。但是水葫芦娃希望深海龙王抓的知了能发出越来越响的鸣叫声,起码得要单调不减!

题意

给你一颗树(n<=100000),让你求上面的最长不下降子序列。

分析

其实不要被树吓到了,这是一道简单题,我们仍然可以用nlogn的方法去做这道题。
我们可以从根开始做,然后每次更新每个节点的时候递归下去
递归完后,就可以直接去把值还原。
在这里,顺便补充一下,如何nlogn求最长不下降子序列:
我们可以发现,原来的dp方程f[i]=f[j]+1,中a[j]的值,
我们想保留j,仅当f[j]最大时,a[j]最小(我们可以贪心的想,这样可以为后面贡献更大)
于是我们便可以接着根据这个思路接着想下去:
从头开始枚举,设答案是ans,f[k]表示答案为k时最小的a[j]的值是多少。
那么若枚举的a[i]>f[ans]那么ans++,f[ans]=a[i];
上面便表示a[i]可以对答案做出贡献,那么若不能大于呢?它还有没有贡献呢?其实还是一样是有的!
我们二分出最大的k,使得f[k]<a[i]

0 0
原创粉丝点击