K-th Closest Distance HDU - 6621(第k小绝对值+主席树+二分)
You have an array: a1, a2, , an and you must answer for some queries.
For each query, you are given an interval [L, R] and two numbers p and K. Your goal is to find the Kth closest distance between p and aL, aL+1, …, aR.
The distance between p and ai is equal to |p - ai|.
For example:
A = {31, 2, 5, 45, 4 } and L = 2, R = 5, p = 3, K = 2.
|p - a2| = 1, |p - a3| = 2, |p - a4| = 42, |p - a5| = 1.
Sorted distance is {1, 1, 2, 42}. Thus, the 2nd closest distance is 1.
Input
The first line of the input contains an integer T (1 <= T <= 3) denoting the number of test cases.
For each test case:
冘The first line contains two integers n and m (1 <= n, m <= 10^5) denoting the size of array and number of queries.
The second line contains n space-separated integers a1, a2, …, an (1 <= ai <= 10^6). Each value of array is unique.
Each of the next m lines contains four integers L’, R’, p’ and K’.
From these 4 numbers, you must get a real query L, R, p, K like this:
L = L’ xor X, R = R’ xor X, p = p’ xor X, K = K’ xor X, where X is just previous answer and at the beginning, X = 0.
(1 <= L < R <= n, 1 <= p <= 10^6, 1 <= K <= 169, R - L + 1 >= K).
Output
For each query print a single line containing the Kth closest distance between p and aL, aL+1, …, aR.
Sample Input
1
5 2
31 2 5 45 4
1 5 5 1
2 5 3 2
Sample Output
0
1
现在才写这篇博客有点晚了。当时做这道题的时候还不太会,现在想想大体上可以想明白了。
这种第k大或者第k小的问题就是主席树。但是这次是绝对值第k小,这就很懵逼。。我们二分去找答案,二分到一个值之后,在[0,1000000]这个区间里去看[p-mid,p+mid]这个区间内有多少个值,要是个数小于k说明需要扩大范围,要是大于k的话,就需要减少范围。但是要是等于k,也要去减少范围,因为我们需要去更精确这个值。
代码如下:
快速读入优化后只需要3000+ms,有时候读入优化真的很管用。。
努力加油a啊,(o)/~
总结
以上是生活随笔为你收集整理的K-th Closest Distance HDU - 6621(第k小绝对值+主席树+二分)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Super Mario HDU - 44
- 下一篇: 热狗树 树形dp(中国石油大学我要变强