第k小整数(树状数组)

洛谷传送门

入门难度。。

没错,但是我并不是要暴力做。

而是用树状数组来做。

先离散化,然后随便搞一搞就可以了。(晕。比暴力还慢)

如果要查找某一区间的的话可以把区间取出重新建树,然后再求。(更暴力)

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 #define N 10001
 5 #define lowbit(x) x & -x
 6 
 7 using namespace std;
 8 
 9 int n, m, k;
10 int c[N];
11 bool b[3 * N];
12 struct node
13 {
14     int val, id;
15 }a[N];
16 
17 inline bool cmp(node x, node y)
18 {
19     return x.val < y.val;
20 }
21 
22 inline void add(int x)
23 {
24     while(x <= m)
25     {
26         c[x]++;
27         x += lowbit(x);
28     }
29 }
30 
31 int solve(int k)
32 {
33     int i, cnt = 0, ans = 0;
34     for(i = 20; i >= 0; i--)
35     {
36         ans += 1 << i;
37         if(ans >= m || cnt + c[ans] >= k) ans -= 1 << i;
38         else cnt += c[ans];
39     }
40     return ans + 1;
41 }
42 
43 int main()
44 {
45     int i, x;
46     scanf("%d %d", &n, &k);
47     for(i = 1; i <= n; i++)
48     {
49         scanf("%d", &x);
50         if(!b[x]) b[x] = 1, a[++m].val = x, a[m].id = m;
51     }
52     if(m < k)
53     {
54         printf("NO RESULT");
55         return 0;
56     }
57     sort(a + 1, a + m + 1, cmp);
58     for(i = 1; i <= m; i++) add(a[i].id);
59     printf("%d\n", a[solve(k)].val);
60     return 0;
61 }
View Code

 

posted @ 2017-04-21 14:53  zht467  阅读(160)  评论(0编辑  收藏  举报