码迷,mamicode.com
首页 > 其他好文 > 详细

树状数组求逆序数

时间:2014-08-08 18:20:56      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:style   color   os   io   strong   for   amp   size   

树状数组求逆序数


样例输入:

3

1 2 3

4

4 3 2 1

样例输出:

0

6


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10005];
int n;

int lowbit(int t)
{
    return t&(-t);
}

void Update(int i,int d)   //更新含有x的数组个数
{
    while(i<=n)
    {
        a[i]+=d;
        i+=lowbit(i);
    }

}

int Getsum(int i)   //向下统计小于x的个数
{
    int sum=0;
    while(i>0)
    {
        sum+=a[i];
        i-=lowbit(i);
    }
    return sum;
}

int main ()
{
    int i,k;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        int ans=0;
        for(i=1;i<=n;i++)
        {
            cin>>k;         //  一个个插入到树状数组
            Update(k,1);
            ans+=i-Getsum(k);    //  i-Getsum(k)  表示为比k大的数,即逆序数
        }
        cout<<ans<<endl;
    }
    return 0;
}



离散操作+树状数组


样例输入:

5

9 1 0 5 4


离散操作流程:


1.结构体存储:

 k:    9 1 0 5 4

orde:  1 2 3 4 5


2.排序后:

 k:   0 1 4 5 9

orde: 3 2 5 4 1


3.储存到a数组:

a[3]=1;

a[2]=2;

a[5]=3;

a[4]=4;

a[1]=5;


4.最终结果:

 i:   1 2 3 4 5 

a[i]: 5 2 1 4 3


原输入: 9 1 0 5 4

离散后: 5 2 1 4 3



#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10005];   // 存离散化后的数组
int c[10005];   // 存树状数组
int n;

struct node
{
  int k,orde; 
}p[10005];

bool cmp(node a,node b)
{
    return (a.k<b.k);
}

int lowbit(int t)
{
    return t&(-t);
}

void Update(int i,int d)
{
    while(i<=n)
    {
        c[i]+=d;
        i+=lowbit(i);
    }

}

int Getsum(int i)
{
    int sum=0;
    while(i>0)
    {
        sum+=c[i];
        i-=lowbit(i);
    }
    return sum;
}

int main ()
{
    int i,j;
    while(cin>>n)
    {
        for(i=1;i<=n;i++)
        {
            cin>>p[i].k;
            p[i].orde=i;
        }
        // 离散化
        sort(p+1,p+n+1,cmp);
        for(i=1;i<=n;i++)
            a[p[i].orde]=i;

        memset(c,0,sizeof(c));
        int ans=0;
        for(j=1;j<=n;j++)
        {
            Update(a[j],1);
            ans+=j-Getsum(a[j]);
        }
        cout<<ans<<endl;
    }
    return 0;
}


树状数组求逆序数,布布扣,bubuko.com

树状数组求逆序数

标签:style   color   os   io   strong   for   amp   size   

原文地址:http://blog.csdn.net/fyxz1314/article/details/38440173

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!