• Inversion_归并排序


    Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u

    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.

    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).

    Output

    For each tests: 

    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
    ",cnt);
        }
        return 0;
    }
  • 相关阅读:
    文件权限---I
    python查看变量在内存中的地址
    Python3 基本数据类型
    print语法
    任务管理器启动项显示“没有可显示的启动项”如何解决?
    nginx 虚拟主机配置
    nginx 高级应用
    nginx 日志文件详解
    nginx 编译安装与配置使用
    python获取header脚本
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/5811724.html
Copyright © 2020-2023  润新知