随笔 - 128,  文章 - 0,  评论 - 6,  阅读 - 56968

两道题都是区间第K大询问,数据规模基本相同。

解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多。

这里大致讲一下我对主席树的理解。

首先,如果对于某个区间【L,R】,对这个区间排序后,我们构造出了线段树, 每个值在这个子区间出现了几次都可以从线段树中查询,我们就可以在对数时间解决询问。

现在的问题就是怎样在时空复杂度O(nlogn)的时间内构造出这么多的线段树!


1.首先对原序列a排序并删去重复得到新序列b 

2.对a的每个前缀构造线段树,即a的前i个数出现在b的[L,R]中的个数。

3.相邻前缀的线段树只有一条边不同,故每次只需要增加logn个点,总的空间复杂度O(nlogn)

4.前缀线段树的可加性,rt[r]-rt[l-1]就表示了原序列a[l,r]在新序列b[L,R]的数量。

代码很清晰,参照代码和上述4个性质,应该可以很快理解主席树。

 

一句话总结一下, 在本题中, 主席树就的功能就是快速的告诉我们:

  原序列a的子序列a[l,r]在a排序后的序列b的子序列[L,R]中的个数。

 

 

  

 

posted on   Bingsen  阅读(172)  评论(0编辑  收藏  举报
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示