• 「树状数组 + 二分」迷一样的牛


    谜一样的牛

    原题链接:迷一样的牛

    题目大意

    给你N头牛,再给你第(i)头牛前面有多少个比它低的牛,问你每头牛的身高

    (数的大小要求紧挨着 1 2 3 4 5 这种,不允许 2 4 6 8 10 这种)

    题目题解

    emmm,也是套路题,好像有道贪心挺像的

    当前位前面有几个比它低的,那么就算前面的前缀和,然后算出前缀和等于比它低的了,那么前缀和+1就是它的位置,读入的时候顺着读,处理的时候逆着处理,因为如果顺着处理有些位置可能会重复(也就是说重复的位置后面的所有数都要往后面移动一位,可以自己理解一下)

    代码如下

    //#define fre yes
    
    #include <cstdio>
    
    const int N = 200005;
    int arr[N], b[N], ans[N];
    
    int n;
    
    namespace Union {
        int lowbit(int x) {
            return x & (-x);
        }
        
        inline void add(int x, int k) {
            while(x <= n) {
                b[x] += k;
                x += lowbit(x);
            }
        }
        
        int ask(int x) {
            int res = 0;
            while(x) {
                res += b[x];
                x -= lowbit(x);
            } return res;
        }
    }
    
    int main() {
        scanf("%d", &n);
        Union::add(1, 1);
        for (int i = 2; i <= n; i++) {
            scanf("%d", &arr[i]);
            Union::add(i, 1);
        }
        
        for (int i = n; i >= 1; i--) {
            int l = 1, r = n;
            while(l < r) {
                int mid = (l + r) >> 1;
                if(Union::ask(mid) < arr[i] + 1) l = mid + 1;
                else r = mid;
            }
            
            ans[i] = r;
            Union::add(r, -1);
        }
        
        for (int i = 1; i <= n; i++) {
            printf("%d
    ", ans[i]);
        } return 0;
    }
    
  • 相关阅读:
    利用js在Table中追加数据
    C#API配置跨域
    C#linq查询DataTable
    erlang格式化输出
    erlang 的源代码保护机制
    MP3格式音频文件结构解析
    使用异步 I/O 大大提高应用程序的性能
    虚拟机安装mac 关键是换引导
    C/C++规则整理
    字节对齐
  • 原文地址:https://www.cnblogs.com/Nicoppa/p/11585691.html
Copyright © 2020-2023  润新知