逆序数的分治求解,时间复杂度O(nlgn)。基本思想是在归并排序的基础上加逆序计数。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std; #define MAXN 100005 int a[MAXN], b[MAXN];
int c[MAXN];
int ans, n; void merge(int *a, int l, int r) {
int mid = (l+r)>>;
int i = l, j = mid+;
int n = ; while (i<=mid && j<=r) {
if (a[i] <= a[j]) {
c[n++] = a[i++];
} else {
c[n++] = a[j++];
ans += (mid-i+);
}
}
while (i <= mid)
c[n++] = a[i++];
while (j <= r)
c[n++] = a[j++];
for (i=, j=l; i<n; ++i, ++j)
a[j] = c[i];
} void mergeSort(int *a, int l, int r) {
int mid = (l+r)>>; if (l >= r)
return ;
mergeSort(a, l, mid);
mergeSort(a, mid+, r);
merge(a, l, r);
} void bruteSolve(int *b, int l, int r) {
int i, j; for (i=l; i<=r; ++i) {
for (j=l; j<=i; ++j) {
if (b[j] > b[i])
++ans;
}
}
} void init() {
int i; n = rand()%(MAXN-)+;
for (i=; i<=n; ++i) {
a[i] = rand();
b[i] = a[i];
}
} void solve() {
clock_t beg, end;
int tmp; ans = ;
beg = clock();
mergeSort(a, , n);
end = clock();
printf("nlgn: ans = %d\n", ans);
printf(" time = %.2lf\n", (double)(end-beg)/CLOCKS_PER_SEC); tmp = ans;
ans = ;
beg = clock();
bruteSolve(b, , n);
end = clock();
printf("n*n : ans = %d\n", ans);
printf(" time = %.2lf\n", (double)(end-beg)/CLOCKS_PER_SEC); if (tmp != ans)
printf("**** wrong ****\n");
printf("\n");
} int main() {
int t = ; while (t--) {
init();
solve();
} return ;
}

【Algorithm】逆序数的分治求解的更多相关文章

  1. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  2. hdu 4911 Inversion (分治 归并排序 求逆序数)

    题目链接 题意:给n个数,求交换k次相邻的数之后的最小的逆序数对. 用分治的方法,以前在poj上做过这种题,昨天比赛的时候忘了.... 下面的归并排序还是以前的模板. #include <ios ...

  3. HDU 6318 Swaps and Inversions 思路很巧妙!!!(转换为树状数组或者归并求解逆序数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. 递归O(NlgN)求解逆序数

    导言 第一次了解到逆序数是在高等代数课程上.当时想计算一个数列的逆序数直觉就是用两重循环O(n^2)暴力求解.现在渐渐对归并算法有了一定的认识,因此决定自己用C++代码小试牛刀. 逆序数简介 由自然数 ...

  5. (分治)51NOD 1019 逆序数

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.   如2 4 3 1中,2 1,4 3,4 1,3 1是 ...

  6. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  7. HDU-Minimum Inversion Number(最小逆序数)

    Problem Description The inversion number of a given number sequence a1, a2, ..., an is the number of ...

  8. 逆序数2 HDOJ 1394 Minimum Inversion Number

    题目传送门 /* 求逆序数的四种方法 */ /* 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N] 它的 ...

  9. 逆序数 POJ 2299 Ultra-QuickSort

    题目传送门 /* 题意:就是要求冒泡排序的交换次数. 逆序数:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序. 一个排列中逆序的总数就称为这个排列的逆 ...

随机推荐

  1. LinearLayout增加divider分割线

    在android3.0及后面的版本在LinearLayout里增加了个分割线 1 2 android:divider="@drawable/shape"<!--分割线图片-- ...

  2. [Javascript] Log Levels and Semantic Methods

    Go beyond console.log by learning about log levels, filtering log output and structuring your output ...

  3. Linux开发工具之gdb(下)

    三.gdb调试(下) 01.查看运行时数据 print - 查看变量值 ptype - 查看类型 print array - 查看数组 print *array@len - 查看动态内存 print ...

  4. 突然想写点东西,关于web新人的。采用问答方式

    我自己是会计专业,转行自学web的,学习有一两年了,也还是新人一个,只不过不是那种超级“新”的,所以有什么话说得不对,请轻喷.欢迎大家来和我交流. 1.我能不能转行学web? 能不能学web这个不是别 ...

  5. php 写model层

    <?php /** * @author Administrator * */ class User { private $id; private $admin; private $paw; pr ...

  6. Linux sed命令在指定行前后添加内容

    一.在匹配行前后加内容在包含www.baidu.com的行前面或后面添加多一行内容www.qq.com#匹配行前加sed -i '/www.baidu.com/i www.qq.com' domain ...

  7. 【转】 NSArray copy 问题

    转自:   http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html   好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解 ...

  8. 使用mailto在网页中链接Email地址

    <a>标签还有一个作用是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件.我们还可以利用mailto做许多其它事情.下面一一进行讲解,请看详细图示: 注意:如 ...

  9. IOS改变状态栏样式

    1.状态栏高亮颜色 在info.plist中添加 View controller-based status bar appearance 设置为 "NO"在AppDelegate. ...

  10. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...