树状数组离散化求逆序数
2016-04-14 20:57
381 查看
树状数组可以用来求逆序数, 当然一般用归并求。如果数据不是很大, 可以一个个插入到树状数组中, 每插入一个数, 统计比他小的数的个数,对应的逆序为 i- getsum( da
ta[i] ),其中 i 为当前已经插入的数的个数, getsum( data[i] )为比 data[i] 小的数的个数i- sum( data[i] ) 即比 data[i] 大的个数, 即逆序的个数但如果数据比较大,就必须采用离散化方法。一关键字的离散化方法:所谓离散化也就是建立一个一对一的映射。 因为求逆序时只须要求数据的相应
大小关系不变。如: 10 30 20 40 50 与 1 3 2 4 5 的逆序数是相同的定义一个结构体 struct Node{ int data; // 对应数据 int pos; // 数据的输入顺序 };
先对 data 升序排序, 排序后,pos 值对应于排序前 data 在数组中的位置。再定义一个数组 p
, 这个数组为原数组的映射。以下语句将按大小关系把原数组与 1到 N 建立一一映射。
ta[i] ),其中 i 为当前已经插入的数的个数, getsum( data[i] )为比 data[i] 小的数的个数i- sum( data[i] ) 即比 data[i] 大的个数, 即逆序的个数但如果数据比较大,就必须采用离散化方法。一关键字的离散化方法:所谓离散化也就是建立一个一对一的映射。 因为求逆序时只须要求数据的相应
大小关系不变。如: 10 30 20 40 50 与 1 3 2 4 5 的逆序数是相同的定义一个结构体 struct Node{ int data; // 对应数据 int pos; // 数据的输入顺序 };
先对 data 升序排序, 排序后,pos 值对应于排序前 data 在数组中的位置。再定义一个数组 p
, 这个数组为原数组的映射。以下语句将按大小关系把原数组与 1到 N 建立一一映射。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 500004 int c[MAX],f[MAX]; struct lisan{ int v,num; }a[MAX]; int cmp(lisan a,lisan b) { return a.v<b.v; } int n; int lowbit(int x) { return x&(-x); } void update(int x,int num) { while(x<=n) { c[x]+=num; x+=lowbit(x); } } int get_sum(int x) { int s=0; while(x>=1) { s+=c[x]; x-=lowbit(x); } return s; } int main() { int i; while(scanf("%d",&n),n) { memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { scanf("%d", &a[i].v); a[i].num=i; } sort(a+1,a+1+n,cmp); for(i=1;i<=n;i++) f[a[i].num]=i; int sum=0; printf("f : "); for(int j = 1; j <= n; j++) printf("%d ", f[j]); printf("\n"); for(i=1;i<=n;i++) { update(f[i],1); printf("c : "); for(int j = 1; j <= n; j++) printf("%d ", c[j]); printf("\n"); sum+=i-get_sum(f[i]); } printf("%d\n",sum); } return 0; }
相关文章推荐
- Tomcat调优总结
- nyoj 485 九余数定理
- 【操作系统之进程】
- hdu5122 K.Bro Sorting
- 【day0414 C++】优先级队列 priority_queue的使用
- 6、rqt_console和roslaunch
- kafka入门
- Oracle学习四
- [bzoj4424]Fairy
- 一、JNI 小练习
- 十大数据挖掘算法及各自优势
- Redis源代码分析(十二)--- redis-check-dump本地数据库检測
- C语言 复制字符串 malloc
- ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法
- spring,mybatis事务管理配置与@Transactional注解使用
- 查找TcpSocket传递消息的结束边界方法
- fill与memset的区别
- Toast-进阶
- 微信支付--网页版-V3-(3)
- HTML解析原理