51Nod 1019 逆序数 (归并排序)

 1 #include <iostream>
 2 #include <cstring>
 3
 4 using namespace std;
 5 const int maxn = 50005;
 6 int a[maxn];
 7 int res[maxn];
 8 int ans;
 9
10 //归并排序
11 void merge(int l, int r){
12     //cout<<l<<"  "<<r<<endl;
13     int mid = (l + r) >> 1;
14     int i = l, j = mid + 1;
15     int cur = l;
16     while (i <= mid && j <= r){
17         if (a[i] <= a[j])
18             res[cur++] = a[i++];
19         else{
20             res[cur++] = a[j++];
21             ans += mid - i + 1;        //找到逆序的个数
22         }
23     }
24     while (i <= mid)    res[cur++] = a[i++];
25     while (j <= r)    res[cur++] = a[j++];
26     //排序好后
27     for (int i = l; i <= r; i++)    a[i] = res[i];
28 }
29 void mer_sort(int l, int r){
30     if (l < r){
31         int mid = (l + r) >> 1;
32         mer_sort(l, mid);            //分解
33         mer_sort(mid + 1, r);        //分解
34         merge(l, r);                //合并
35     }
36 }
37 int main()
38 {
39     int n;
40     while (cin >> n){
41         for (int i = 1; i <= n; i++)    cin >> a[i];
42
43         ans = 0;
44         mer_sort(1, n);
45         cout << ans << endl;
46     }
47     return 0;
48 }

原文地址:https://www.cnblogs.com/jaydenouyang/p/8653762.html

时间: 2024-11-20 15:04:03

51Nod 1019 逆序数 (归并排序)的相关文章

51Nod 1019 逆序数(线段树)

题目链接:逆序数 模板题. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 #define lson i << 1, L, mid 7 #define rson i << 1 | 1, mid + 1, R 8 9 const int N = 100010; 10 11 long long ans

51nod 1019 逆序数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= Aii <= 10^9)Output输出逆序数Sample Input 4 2 4 3 1 Sample Output 4 逆序数

1019 逆序数

1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input 第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9) Ou

逆序数(归并排序)

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input 第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9) Output 输出逆序数 Input示例 4 2 4 3 1 Output示例 4 这题用归并排序做

nyist oj 117 求逆序数 (归并排序&amp;&amp;树状数组)

求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出它的逆序数是多少. 比如 1 3 2 的逆序数就是1. 输入 第一行输入一个整数T表示测试数据的组数(1<=T<=5) 每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000) 随后的一行共有N个整

1203: 逆序数 ( 归并排序 )

1203: 逆序数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 125 Solved: 26 [Submit][Status][Web Board] Description 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数不小于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input 多组测试数

【51NOD-0】1019 逆序数

[算法]离散化+树状数组(求逆序对) [题解]经典,原理是统计在i之前插入的且值≤i的个数,然后答案就是i-getsum(i) #include<cstdio> #include<algorithm> #include<cstring> #define lowbit(x) x&(-x) using namespace std; const int maxn=50010; int A[maxn],ord[maxn],a[maxn],b[maxn],n,s; boo

归并排序——计算逆序数

归并排序——计算逆序数 归并排序用了分治的思想,时间复杂度o(N*logN)动态内存的运用可减小空间开销: 归并排序还可用于计算逆序数: 逆序数:序列中位置和大小相反的一对数字: 逆序数=冒泡排序中相邻两个数字交换的次数: int a[maxn],n; long long ans; //逆序数一般很大,用long long void compute_ans(int*a,int begin,int mid,int end) { int len_L=mid-begin+1; int len_R=en

poj 2299 逆序数

http://poj.org/problem?id=2299 坑:答案是long long 输出……!!!!! 题意是:求一个数组进行冒泡排序交换的次数 题解:求逆序数 题解Ⅰ: 归并排序求逆序数 归并排序求逆序数之前写过 1.归并排序是把两个有序的数组合并成为一个有序的数组,利用分治的思想就可以进行排序 逆序数可以利用这个思想求 求出第一个数组的逆序数,和第二个数组的逆序数,再将两个数组整体的逆序数求出来 f(x,y) = f(x,mid) + f(mid,y) + 之后数组的逆序数 #inc