zoukankan      html  css  js  c++  java
  • SGU180 Inversions

    题目大意

    给定N个数,a1,a2,3,a4..an,要求你求出这样的对数:i<=i<j<=n并且a[i]>a[j]。

    题解

    就是逆序对问题。。。果断用树状数组做,数据有点大0<=Ai<=10^9,需要进行离散化,离散的时候注意会有相同的数,最先没注意这个,提交上去第二组数据就WA了。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MAXN 70000
    using namespace std;
    typedef struct
    {
        long id;
        long t;
    } NODE;
    NODE a[MAXN];
    long long c[MAXN],f[MAXN];
    long n;
    long lowbit(long x)
    {
        return x&-x;
    }
    long sum(long x)
    {
        long ret=0;
        while(x>0)
        {
            ret+=c[x];
            x-=lowbit(x);
        }
        return ret;
    }
    void add(long x,long d)
    {
        while(x<=n)
        {
            c[x]+=d;
            x+=lowbit(x);
        }
    }
    bool cmp(NODE x,NODE y)
    {
        return  x.t<y.t;
    }
    int main(void)
    {
        long i,pre,v;
        long long ans;
        scanf("%ld",&n);
        for(i=1; i<=n; i++)
        {
            scanf("%ld",&a[i].t);
            a[i].id=i;
        }
        sort(a+1,a+n+1,cmp);
        memset(c,0,sizeof(c));
        pre=-1;
        v=0;
        for(i=1; i<=n; i++)
        if(a[i].t!=pre)
        {
            pre=a[i].t;
            a[i].t=++v;
        }
        else
        a[i].t=v;
        ans=0;
        for(i=1;i<=n;i++)
        f[a[i].id]=a[i].t;
        for(i=n; i>=1; i--)
        {
            add(f[i],1);
            ans+=sum(f[i]-1);
        }
        printf("%I64d\n",ans);
        return 0;
    }
  • 相关阅读:
    java线程间的协作
    java线程间的共享
    java多线程基础API
    java并发编程基础概念
    如何设计一套规则引擎系统
    Stream—一个早产的婴儿
    Java函数式编程的前生今世
    关于微服务划分的一些思考
    如何更优雅的给控制器 “减负”
    PHP简洁之道
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3026382.html
Copyright © 2011-2022 走看看