洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

正解:主席树+倍增+分治

解题报告:

传送门!

首先看到这题会想到之前考过的这题

但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已

这题就不一样,因为它说了是按照原树上的顺序再命名,而且还是只截一棵子树

而且那题麻油已知的图的形状,每次都要重新建一个图,所以不存在倍增之类的玩意儿

这题是给定了树的形状了,然后给一堆询问

所以这题的代码要麻烦很多

不过只是题解的话麻油什么关系,毕竟思维难度其实比那题还简单那么点儿来着,,,因为那题有一种路径很难被想到,但这题是棵树就不用想这么些杂七杂八的玩意儿辣QAQ

所以先说下思路趴

最基本的思路不难想到,就如果询问的两点本来就在一棵子树上,直接求距离

不然就求出他们各自与所在子树的根的距离,递归求根之间的距离,知道变成情况一就好

然后这个思路不够优秀,,,所以是会T的,而且还有几个细节不好处理,下面分别港下QAQ

首先会要想到,其实编号什么的是不好求的,因为它是截取的一部分

所以考虑变成按照原子树的节点编号顺序排列的一个序列,显然一棵子树是一段连续的区间,所以这题就变成了求区间第k大,这不就是主席树板子题了嘛,权值线段树+离散化+主席树就好,我刚好昨天刚做的这题来着23333

然后关于怎么到同一棵子树上,我说的那个情况二只是方便理解,实际上这样应该是会T的

所以要考虑优化

考虑倍增,f[i][j]表示第i个点跳j棵树到达的树的编号,这样就和跳lca是差不多的辣,然后内部再做一些距离什么之类的乱七八糟的东西就好了,,,

综上,这题思路并不特别复杂,但是代码比较复杂,所以我也不知道我代码会咕到什么时候

猜你喜欢

转载自www.cnblogs.com/lqsukida/p/10434197.html