谈谈这一道题的最强烈的感受在于,我的主席树入门是经典题目区间第k大树查询(当然,因为poj上不会强制在线,还用树套树和整体二分写过那道题),因此,对于主席树的理解仅仅是一个区间历史版本维护的理解,即类似于树套树的外层区间树内层全值树。但是忽略了主席树的真正伟大之处在于可持久化,而可持久化的也能是权值。
对于这一道题,由于我们不知道中位数是多少,因此考虑二分,而关键之处在于如何二分cheak,可以这样,把所有大于这个数的数定义为1,而小于这个数的定义为-1,那么只要一段区间区间和大于等于0就说明当前值是可行的,继续二分,关键就在于如何快速得到一段区间的最大和。最简单的思想是对于每一次的询问,我On的一次处理,把比他大的赋值为1,小的赋值为-1,然后可以利用线段树维护区间最大和得到,然后进一步思考,发现每一次都On赋值肯定受不老,那么思考树套树,对于没一个权值(离散化后)都建立一个区间树,这个树就储存每一个位置是-1,还是1,但是还是受不了,不够思想已经很接近了,我们继续观察可以发现,其实每一个权值对于上一个权值来说的相对状态只有一个数不同,我们先按权值排序,然后主席树的每一个叶子节点都是1(对于最小的数来说其他数都比他大),然后不断插入更大取值的节点,不断更新这个主席树,最后就得到一个类似于外层权值树内层区间树的主席树,不过充分利用了先前的信息,这就是可持久化操作的美妙之处了把。