I. 线段树

题目要意:你需要用给定的值构造一颗区间和线段树,值可以重复选

关键词:构造,暴力,数据结构/阅读理解

事实上,这也是一个命题作文,原先的线段树题被毙掉了才有的这题

把线段树的外表拨开,事实上,这是一颗完全二叉树

注意到m,nm,n的特殊限制,mm不大,nn是2i−12^{i}-1的形式,意味着这颗完全二叉树是一颗满二叉树

容易想到每个父节点是由两个子节点相加而成的,并且需要子树高度这么多的合成次数,并且不会出现某一部分可以用合成次数小的节点合成(因为是满二叉树)

所以,我们只需要找到一个log2[(n+1)]−1log_2[(n+1)]-1次合成的点,并按照它的合成路径构造这颗线段树。

事实上对合成进行优化有O(m2)O(m^2)甚至更优的做法,但考虑到可能的其他语言提交以及 我在偷懒,std只提供了一种O(m2logmlogn)O(m^2logmlogn)的做法,构造的数据也较弱,常数较优的做法的运行时间会非常快。

0 条评论

目前还没有评论...

信息

ID
96
时间
ms
内存
MiB
难度
1
标签
(无)
递交数
41
已通过
34
上传者