逆序数的分治求解,时间复杂度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. evernote出现"Invalid username and/or password"的情况

    evernote出现"Invalid username and/or password"的情况 evernote挺好用的,可是这几年用下来也遇到过狗血情况,几乎每次都是更新后出状况 ...

  2. 网络环境场景以及模拟工具netem

    网络环境场景包括: 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况. 掉包(Drop),随机丢弃一些数据. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的 ...

  3. ACCSESS数据库导入到SQL SEVERES2005

    首先打开Access数据库然后选择一张表,右击选择要导入数据库的类型(此处已sql2005为例) 然后选择新建 点击下一步 选择导入数据库类型(sql) 输入一个名称,在前面能用到(此处建的是250) ...

  4. git针对Android Studio的使用

    1.将文件放到项目根目录下 .gitignore 文件内容: *.iml.gradle/local.properties/.idea/workspace.xml/.idea/libraries.DS_ ...

  5. plsql 把数据导出成为 .sql文件,记住了

    今天上午,同事 提醒我.可以直接把数据导出成 .sql 文件,类似于 反编译.见下图

  6. Swift - 07 - 布尔类型

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  7. 使用Spring MVC,Mybatis框架等创建Java Web项目时各种前期准备的配置文件内容

    1.pom.xml 首先,pom.xml文件,里面包含各种maven的依赖,代码如下: <project xmlns="http://maven.apache.org/POM/4.0. ...

  8. 0.0C语言重点问题回顾

    左值和右值得区别:左值是用来表明变量的身份的,右值更加侧重于值本身: void*是个例外,它只有基地址没有类型信息,所以无法解引用. int *p = malloc(100); char *s = m ...

  9. [Head First设计模式笔记]----命令模式

    命令模式定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指 ...

  10. 试用ubuntu-12.04.3-desktop-amd64

    由于工作需要,终于要开始使用大名鼎鼎的ubuntu了,从网上下了个ubuntu-12.04.3-desktop-amd64,通过vmware安装,过程相当顺利,只是装完后重启动,发现回到了命令行模式. ...