逆序数 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 <= A[i] <= 10^9)

Output

输出逆序数

Input示例

4
2
4
3
1

Output示例

4

看程序吧  不会讲

 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cmath>
12 #include<cstring>
13 #include <cstdio>
14 #include <cstdlib>
15 #include<stack>
16 #include<vector>
17 int a[51000];
18 int b[51000];
19 long long sum=0;
20 void dfs1(int kaishi,int zhongjian,int jieshu)
21 {
22     int i=kaishi,j=zhongjian+1;
23     int k=kaishi;
24     while(i<=zhongjian&&j<=jieshu)
25     {
26         if(a[i]<a[j])
27             b[k++]=a[i++];
28         else
29         {
30
31             b[k++]=a[j++];
32             sum+=zhongjian-i+1;
33             //cout<<j<<"_"<<k<<endl;
34             continue;
35         }
36     }
37     while(i<=zhongjian)
38     {
39         b[k++]=a[i++];
40     }
41     while(j<=jieshu)
42     {
43         b[k++]=a[j++];
44     }
45     for(i=kaishi;i<=jieshu;i++)
46         a[i]=b[i];
47 }
48 void dfs(int kaishi,int jieshu)
49 {
50     if(kaishi<jieshu)
51     {
52         int zhongjian=(kaishi+jieshu)/2;
53         dfs(kaishi,zhongjian);
54         dfs(zhongjian+1,jieshu);
55         dfs1(kaishi,zhongjian,jieshu);
56     }
57 }
58 int main()
59 {
60     int n;
61     scanf("%d",&n);
62     for(int i=0;i<n;i++)
63         {
64             scanf("%d",&a[i]);
65             b[i]=a[i];
66         }
67     dfs(0,n-1);
68     cout<<sum<<endl;
69     return 0;
70 }

时间: 2024-08-05 09:07:28

逆序数 51nod 1019 归并 分治的相关文章

51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)

1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的连线斜率 < 0,因此斜率小于0的连线数量为2. Input 第1行:1个数N,N为点的数量(0 <= N <= 50000) 第2

逆序数 HDOJ 4911 Inversion

题目传送门 题意:可以交换两个相邻的数字顺序k次,问最后逆序对最少有多少 分析:根据逆序数的定理如果逆序数大于0,那么必定存在1<=i<n使得i和i+1交换后逆序数减1假设原逆序数为cnt,这样的话,我们就可以得到答案是max(cnt-k,0)求逆序数可以用归并的方法 代码: /************************************************ * Author :Running_Time * Created Time :2015/9/12 星期六 20:31:0

HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个n个数的序列,其中组成的数只有0-n,我们可以进行这么一种操作:把第一个数移到最后一个,次数不限.问,在原始数列和最新生成的数列中逆序数最小可以是多少? 刚开始以为需要枚举求逆序数,但最后知道了这个题是有规律的:一个由0-n组成的n个数的数列,当第一个数移到最后一位的时候,整个数列的逆序数会减少x[i](移动前,后面比他小的),会增加n-x[i]-1(移动后,前面比他大的). 那

Ultra-QuickSort - poj 2299 (归并排序+统计逆序数)

利用归并排序统计逆序数,利用归并求逆序在对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s2[j]都是逆序的. 1 #include <stdio.h> 2 #include <stdlib.h> 3 int N; 4 int num[500001]; 5 int tmp[500001]; 6 __int64 count; 7 void Merge(int l,int mi

归并排序——计算逆序数

归并排序——计算逆序数 归并排序用了分治的思想,时间复杂度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

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 逆序数

《程序设计与算法(二)算法基础》《第五周 分治》求排列的逆序数 11

011:求排列的逆序数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它们之间的差异.考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排

归并算法经典应用——求解逆序数

本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前介绍线性代数行列式计算公式的时候,我们曾经介绍过逆序数:我们在列举出行列式的每一项之后,需要通过逆序数来确定这一项符号的正负性.如果有忘记的同学可以回到之前的文章当中复习一下: 线性代数行列式 如果忘记呢,问题也不大,这个概念比较简单,我想大家很快就能都搞清楚. 今天的这一篇文章,我想和大家聊聊逆序数的算法,也是一道非常经典的算法题,经常在各大公司的面试题当中出现. 我们先来回顾一下逆序数的定义,所谓逆序数指的是数组当中究竟存在多