对于一个数列,有N个数,Q个询问,每次询问【l,r】间第k大。
第一眼想法如果只有一个询问,直接把【l,r】间的数插入值域线段树再查询即可。
第二眼想法,套个莫队就吼了,O(
M∗N−−√∗logN)
,愉快T……
第三眼想法,把每个前缀插入线段树后的状态记录下来,然后相减。貌似要开N棵树的样子,会炸空间。
然后问题就是如何优化空间,这种方法存在吗?答案是肯定的……
为充分利用空间,窝们可以这么做:
每次插入第i个数字时,其实没必要重新建一棵线段树,毕竟有大部分节点是相同的,所以只对要修改的一条链更新答案即可。
然后对于询问每个询问【l,r】,将两棵线段树r,l-1相减即可。
~~~~
撒花
~~~~~