|NOIOJ|二分归并|7622:求排列的逆序数
2016-05-29 11:52
211 查看
描述
在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。
对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。
一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。显然,由1,2,…,n 构成的所有n!个排列中,最小的逆序数是0,对应的排列就是1,2,…,n;最大的逆序数是n(n-1)/2,对应的排列就是n,(n-1),…,2,1。逆序数越大的排列与原始排列的差异度就越大。
现给定1,2,…,n的一个排列,求它的逆序数。
输入
第一行是一个整数n,表示该排列有n个数(n <= 100000)。
第二行是n个不同的正整数,之间以空格隔开,表示该排列。
输出
输出该排列的逆序数。
样例输入
样例输出
一道水题,用归并排序就可以完成,因为如果a[i]>a[j]说明a[j]比区间[i,mid]中的任何元素都小,且i在j之前,所以能得出mid-i+1个逆序对。所以在合并区间时加上tot+=mid-i+1; 即可
参考代码:
在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。
对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。
一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。显然,由1,2,…,n 构成的所有n!个排列中,最小的逆序数是0,对应的排列就是1,2,…,n;最大的逆序数是n(n-1)/2,对应的排列就是n,(n-1),…,2,1。逆序数越大的排列与原始排列的差异度就越大。
现给定1,2,…,n的一个排列,求它的逆序数。
输入
第一行是一个整数n,表示该排列有n个数(n <= 100000)。
第二行是n个不同的正整数,之间以空格隔开,表示该排列。
输出
输出该排列的逆序数。
样例输入
6 2 6 3 4 5 1
样例输出
8
一道水题,用归并排序就可以完成,因为如果a[i]>a[j]说明a[j]比区间[i,mid]中的任何元素都小,且i在j之前,所以能得出mid-i+1个逆序对。所以在合并区间时加上tot+=mid-i+1; 即可
参考代码:
#include<cstdio> #include<cstring> int n; int a[100001], tmp[100001]; long long tot=0; void init() { scanf("%d", &n); for (int i=1;i<=n;i++) { scanf("%d", &a[i]); } } void ms(int l, int r) { if (l==r) return; int mid = (l+r) / 2; ms(l,mid); ms(mid+1,r); int i=l, p=l, j=mid+1; while (i<=mid && j<=r) { if (a[i]>a[j]) { tot+=mid-i+1; tmp[p++] = a[j++]; } else tmp[p++] = a[i++]; } while (i<=mid) tmp[p++] = a[i++]; while (j<=r) tmp[p++] = a[j++]; for (int i=l;i<=r;i++) a[i] = tmp[i]; } void go() { ms(1,n); printf("%lld", tot); } int main() { init(); go(); return 0; }
相关文章推荐
- Count Color_poj2777_线段树+位运算
- 1369 - Answering Queries
- 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题
- LightOJ 1236 Pairs Forming LCM(lcm(i, j) = n的对数)
- #define st(x) do { x } while (__LINE__ == -1)及“\”分析
- 仿百度首页选项卡切换效果
- HDU1848 Fibonacci again and again(SG函数)
- Java中构造函数的作用
- Android Gradle 指南
- React Native资料集
- 设计一个有getMin功能的栈
- 【java并发】传统线程同步通信技术
- 求教专业人士,视频的码率多少合适?是不是和分辨率、帧率有关?
- AndroidStudio2.0安装Genymotion模拟器插件
- wheel的使用
- spring mvc中设置登录拦截器,报错:元素 "mvc:interceptors" 的前缀 "mvc" 未绑定。
- mysql 配置文件
- Python No module named xxx 的错误
- LightOJ 1245 Harmonic Number (II)(∑ (n / i)(n < 2^31))
- dev C/C++运行结果一闪而过的解决