首页 > 编程语言 > 详细

poj2299 离散化 树状数组求逆序对

时间:2019-04-26 00:39:56      阅读:178      评论:0      收藏:0      [点我收藏+]
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>//poj 2299  题意 输入一个数组,输出冒泡排序 (升序)需要的交换次数
//题解   离散化  树状数组求逆序对
//离散化  将输入数字变成他们大小的顺序 例如: 9 1 0 5 4 变成 5 2 1 4 3
//用lower_bound  或者  结构体就可以实现离散化
//遍历 每个数的移动次数为逆序对的个数  可以用当前的总个数减去比当前数小的数字数(也就是getsum(a[i]))得到
// 也可以用 归并排序 
#define mem0(a) memset(a, 0, sizeof(a))
#define lowbit(x) (x&(-x))
#define ll long long
const int MA = 5e5+100;
int a[MA], b[MA],c[MA],d[MA],n,m;
using namespace std;
struct node{
    int pos,val;
}p[MA];
bool cmp(const node&aa,const node&bb){//not very clear
    return aa.val < bb.val;
}
void add(int k){
    for( ; k <= n; c[k] += 1, k += lowbit(k));
}
int getsum(int k){
    int ret = 0;
    for(; k > 0 ; ret += c[k], k -= lowbit(k));
    return ret;
}
int main(){    
    while(scanf("%d", &n), n){
        mem0(c);
        ll ans = 0;
        /*for(int i = 1; i <= n; i++){
            scanf("%d", &a[i]);
            b[i] = a[i];
        }
        sort(a+1, a+n+1);
        for(int i = 1; i <= n; i++)
            b[i] = lower_bound(a+1, a+n+1, b[i])-a;
        for(int i = 1; i <= n; i++)
            add(b[i]), ans += i-getsum(b[i]);
        printf("%lld\n", ans);
        */
        for(int i = 1; i <= n; i++) {
            scanf("%d", &p[i].val) ,p[i].pos = i;
        }
        sort(p+1, p+n+1, cmp);
         // for(int i = 1; i <= n; i++) printf(" %d ", p[i].pos);printf("\n");
          //for(int i = 1; i <= n; i++) printf(" %d ", p[i].val);printf("\n");
        for(int i = 1; i <= n; i++) a[p[i].pos] = i;
          //for(int i = 1; i <= n; i++) printf(" %d ", a[i]);printf("\n");
        
        for(int i = 1; i <= n; i++)
        {
            add(a[i]);
            ans += a[i]-getsum(a[i]);
        }
        printf("%lld\n", ans);
    }
    return 0;
}
/*
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
*/

 

poj2299 离散化 树状数组求逆序对

原文:https://www.cnblogs.com/163467wyj/p/10771937.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!