zoukankan      html  css  js  c++  java
  • 【洛谷P1774】最接近神的人

    最接近神的人_NOI导刊2010提高(02)

    用类似于桶的方法,树状数组记录原序列的某位置之前已经插入了多少个数,

    插入时树状数组单点加1即可

    先排一遍序,从大到小插入所有数在原序列的位置,

    统计每次插入时,在该元素前面元素的个数,

    前面的元素是先插入的,比该元素大,而在序列中的位置靠前,

    所以这个前缀和是逆序对数

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    #define int long long
    #define lowbit(x) ((x)&(-(x)))
    #define MAXN 500020
    inline int read(){
        int x=0,f=1; char c=getchar();
        while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
        while('0'<=c&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }
        return x*f;
    }
    int n,tree[MAXN<<2];
    struct NODE{
        int pos,value;
    } x[MAXN];
    inline bool cmp(NODE x,NODE y){
        return x.value==y.value?x.pos<y.pos:x.value<y.value;
    }
    void update(int x){
        for(;x<=n;x+=lowbit(x))
         tree[x]++;
    }
    int query(int x){
        int ans=0;
        for(;x;x-=lowbit(x))
         ans+=tree[x];
        return ans;
    }
    #undef int
    int main()
    #define int long long
    {
        scanf("%lld",&n);
        for(int i=1;i<=n;i++){
            x[i].value=read();
            x[i].pos=i;
        }
        sort(x+1,x+1+n,cmp);
        int ans=0;
        for(int i=n;i>=1;i--){
            ans+=query(x[i].pos);
            update(x[i].pos);
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    49 我素故我在
    91 棋盘游戏
    55 删除数组重复元素
    54 删除数组元素
    C++虚函数, 纯虚函数
    iOS-OC-多态
    C++函数引用形参和非引用形参
    怎么清理Mac 硬盘里的其他
    Vue.js中this.$nextTick()的使用
    data中有嵌套,取值要链式取
  • 原文地址:https://www.cnblogs.com/yjkhhh/p/9261629.html
Copyright © 2011-2022 走看看