• 第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
    ", a[solve(k)].val);
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    C# 字符串转为DateTime类型
    多线程的注意事项
    linux 安装中文支持
    发布网站遇到的坑
    配置iis支持json解析,配置ssi
    SEO之图片优化
    SEO之面包屑导航
    SEO之HTML标签
    SEO之优化代码
    SEO之网站内部结构优化
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6743614.html
Copyright © 2020-2023  润新知