给你n,再给你n个数,最后给一个k
求出这个序列的第k大连续区间和; (注意这里重复出现的数字只被统计一次)
N(1<=N<=50000)
ai(1<=ai<=100)
K(1<=K<=(n+1)*n/2).
思路:
预处理前缀和。并将其离散化(去重)。
二分答案,然后每次判断中,遍历前缀和Bi,然后查找有多少个j<i ,满足 Bi-Bj>X,也就是有多少个子序列的和是大于X的,即使求有多少个Bj小于【Bi-X】,这部分查询我们可以用树状数组实现,方法类似于树状数组求逆序对。
查询方法简要说一下,也就是当遍历到Bi的时候,我们找到【Bi-ans】在离散化后在树状数组对应的下标Y,然后查询get(1,Y)看之前出现过的Bi有多少个在这个范围,然后ret+=这部分,最后把Bi插入到树状数组中
复杂度分析: 外层二分是logMAXX咯,然后每次nlogn