Inversion_归并排序
Posted 阿宝的锅锅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Inversion_归并排序相关的知识,希望对你有一定的参考价值。
Description
bobo has a sequence a 1,a 2,…,a n. He is allowed to swap two adjacent numbers for no more than k times.
Find the minimum number of inversions after his swaps.
Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and a i>a j.
Find the minimum number of inversions after his swaps.
Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and a i>a j.
Input
The input consists of several tests. For each tests:
The first line contains 2 integers n,k (1≤n≤10 5,0≤k≤10 9). The second line contains n integers a 1,a 2,…,a n (0≤a i≤10 9).
The first line contains 2 integers n,k (1≤n≤10 5,0≤k≤10 9). The second line contains n integers a 1,a 2,…,a n (0≤a i≤10 9).
Output
For each tests:
A single integer denotes the minimum number of inversions.
A single integer denotes the minimum number of inversions.
Sample Input
3 1 2 2 1 3 0 2 2 1
Sample Output
1 2
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int N=100005; __int64 cnt,k; int a[N],c[N]; //将有二个有序数列a[first...mid]和a[mid...last]合并。 void merge(int a[],int first,int mid,int last,int c[]) { int i=first,j=mid+1; int m=mid,n=last; int k=0; while(i<=m||j<=n) { if(j>n||(i<=m&&a[i]<=a[j])) c[k++]=a[i++]; else { c[k++]=a[j++]; cnt+=(m-i+1); } } for(i=0;i<k;i++) a[first+i]=c[i]; } void mergesort(int a[],int first,int last,int c[]) { if(first<last) { int mid=(first+last)/2; mergesort(a,first,mid,c);//左边有序 mergesort(a,mid+1,last,c);//右边有序 merge(a,first,mid,last,c);//再将二个有序数列合并 } } int main() { int n; while(~scanf("%d%I64d",&n,&k)) { memset(c,0,sizeof(c)); cnt=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } mergesort(a,0,n-1,c); if(k>=cnt) cnt=0; else cnt-=k; printf("%I64d\n",cnt); } return 0; }
以上是关于Inversion_归并排序的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2