主席树

对于一个数列,有N个数,Q个询问,每次询问【l,r】间第k大。
这里写图片描述

第一眼想法如果只有一个询问,直接把【l,r】间的数插入值域线段树再查询即可。
第二眼想法,套个莫队就吼了,O( MNlogN) ,愉快T……
第三眼想法,把每个前缀插入线段树后的状态记录下来,然后相减。貌似要开N棵树的样子,会炸空间。
然后问题就是如何优化空间,这种方法存在吗?答案是肯定的……

为充分利用空间,窝们可以这么做:
这里写图片描述
每次插入第i个数字时,其实没必要重新建一棵线段树,毕竟有大部分节点是相同的,所以只对要修改的一条链更新答案即可。
然后对于询问每个询问【l,r】,将两棵线段树r,l-1相减即可。
~~~~      ~~~~~

代码:
http://paste.ubuntu.com/25373431/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值