码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组求逆序对

时间:2017-11-01 14:56:09      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:++   ring   hang   class   cstring   def   change   求逆   long   


给定n个值中,要求其中的逆序对;
 
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 100005
using namespace std;
int c[maxn],n;
int low_bit(int i)
{
    return i&(-i);
}
void update(int i,int v)
{
    while(i<=n){
        c[i]+=v;
        i+=low_bit(i);
    }
}
int get_sum(int i)
{
    int res=0;
    while(i){
        res+=c[i];
        i-=low_bit(i);
    }
    return res;
}/*树状数组原理就不说了*/
int main()
{
    scanf("%d",&n);
int ans=0;
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
update(a,1);/*a位置的值变为1*/
ans+=i-get_sum(a);/*getsum[a]表示a(包括a)前面有多少个1(它前面的数都是小于它的),假如有k个;
}       此时一共往数组里加了i个数,那么有n-k个数大于它(由于这些数比a先输入,所以他们的位置在a前面),那么由a构成的逆序对就有n-k个*/
printf("%d\n",ans);
    return 0;
}

树状数组求逆序对

标签:++   ring   hang   class   cstring   def   change   求逆   long   

原文地址:http://www.cnblogs.com/Miroerwf/p/7765934.html

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