• SGU180:Inversions(树状数组)


    There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount of such pairs (i, j) that 1<=i<j<=N and A[i]>A[j].

    Input
    The first line of the input contains the number N. The second line contains N numbers A1...AN.

    Output
    Write amount of such pairs.

    Sample test(s)

    Input
    
    
    5 2 3 1 5 4
    Output
    
    
    3


    题意:
    求逆序数

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <bitset>
    #include <list>
    #include <algorithm>
    #include <climits>
    using namespace std;
    
    #define lson 2*i
    #define rson 2*i+1
    #define LS l,mid,lson
    #define RS mid+1,r,rson
    #define UP(i,x,y) for(i=x;i<=y;i++)
    #define DOWN(i,x,y) for(i=x;i>=y;i--)
    #define MEM(a,x) memset(a,x,sizeof(a))
    #define W(a) while(a)
    #define gcd(a,b) __gcd(a,b)
    #define LL long long
    #define N 67000
    #define INF 0x3f3f3f3f
    #define EXP 1e-8
    #define lowbit(x) (x&-x)
    const int mod = 1e9+7;
    
    LL c[N],n,tot,r[N];
    
    struct node
    {
        LL x,s,id;
    } a[N];
    
    int cmp(node a,node b)
    {
        if(a.x!=b.x)
            return a.x<b.x;
        return a.id<b.id;
    }
    
    LL sum(LL x)
    {
        LL ret = 0;
        while(x>0)
        {
            ret+=c[x];
            x-=lowbit(x);
        }
        return ret;
    }
    
    void add(LL x,LL d)
    {
        while(x<=n)
        {
            c[x]+=d;
            x+=lowbit(x);
        }
    }
    
    int main()
    {
        LL i,j,k;
        while(~scanf("%lld",&n))
        {
            MEM(c,0);
            for(i = 1; i<=n; i++)
            {
                scanf("%lld",&a[i].x);
                a[i].id = i;
            }
            sort(a+1,a+1+n,cmp);
            for(i = 1; i<=n; i++)
            {
                r[a[i].id] = i;
            }
            LL ans = 0;
            for(i = 1; i<=n; i++)
            {
                add(r[i],1);
                ans+=(i-sum(r[i]));
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    安卓 Context 和 Application的关系
    Android Intent应用
    android launchmode(四种启动模式)应用场景及实例
    返回数据给上一个活动
    Intent传参数
    安卓activity生命周期
    如何将nideshop部署到本地
    navicat链接数据库错误2013
    数据库设计三大范式
    nodejs版本升级
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7241707.html
Copyright © 2020-2023  润新知