HDU4911:Inversion

Problem Description

bobo has a sequence a1,a2,…,an. 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 ai>aj.

Input

The input consists of several tests. For each tests:

The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).

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

依据逆序数的定理

如果逆序数大于0,那么必然存在1<=i<n使得i和i+1交换后逆序数减1

如果原逆序数为cnt。这种话,我们就能够得到答案是max(cnt-k,0)

求逆序数能够用归并的方法
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int a[100005];
int left[100005], right[100005];
__int64 cnt;

void merge(int* a, int p, int q, int r)
{
    int i, j, k, n1, n2;
    n1 = q-p+1;
    n2 = r-q;
    for (i=0; i<n1; i++)
    {
        left[i] = a[p+i];
    }
    for (i=0; i<n2; i++)
    {
        right[i] = a[q+i+1];
    }
    left[n1] = right[n2] = 0x7fffffff;

    i = j = 0;
    for (k=p; k<=r; k++)
    {
        if (left[i] <= right[j])
        {
            a[k] = left[i];
            i++;
        }
        else
        {
            a[k] = right[j];
            j++;
            cnt += n1-i; /**此步骤是在归并排序法中加的一句,用来计数求逆序数的数目**/
        }
    }
    return;
}

void mergesort(int* a, int p, int r)
{
    int q;
    if (p < r)
    {
        q = (p+r)/2;
        mergesort(a, p, q);
        mergesort(a, q+1, r);
        merge(a, p, q, r);
    }
    return ;
}
int main()
{
    int n,k,i,j;
    while(~scanf("%d%d",&n,&k))
    {
        cnt = 0;
        for(i = 0;i<n;i++)
        scanf("%d",&a[i]);
        mergesort(a,0,n-1);
        printf("%I64d\n",max(cnt-k,(__int64)0));
    }

    return 0;
}
时间: 2024-10-25 06:24:29

HDU4911:Inversion的相关文章

HDU4911——归并排序——Inversion

http://acm.hdu.edu.cn/showproblem.php?pid=4911 /*裸题 有重复的不能用树状数组!!!!sort的时候会出错 */ /************************************************ * Author :Powatr * Created Time :2015-8-19 16:24:11 * File Name :A.cpp ************************************************

hdu-5497 Inversion(滑动窗口+树状数组)

题目链接: Inversion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1087    Accepted Submission(s): 323 Problem Description You have a sequence {a1,a2,...,an} and you can delete a contiguous subsequ

Codeforces 911D. Inversion Counting (数学、思维)

题目链接:Inversion Counting 题意: 定义数列{ai|i=1,2,...,n}的逆序对如下:对于所有的1≤j<i≤n,若ai<aj,则<i,j>为一个逆序对.于是,对于一个数列a[1..n],给定m次操作.对于每一次操作,给定l,r(1≤l<r≤n),将序列a[l..r]倒置.求倒置后的逆序对的数量的奇偶性. 题解: 假设现在我们有一个序列并翻转这个序列[l,r]区间里面的数.假设某个数的k值是指在这个值后面小于这个数的数的个数,其实我们可以发现对于[1,l

C#编程:依赖倒置原则DIP

一.前言 我们先来看看传统的三层架构,如下图所示: 从上图中我们可以看到:在传统的三层架构中,层与层之间是相互依赖的,UI层依赖于BLL层,BLL层依赖于DAL层.分层的目的是为了实现“高内聚.低耦合”.传统的三层架构只有高内聚没有低耦合,层与层之间是一种强依赖的关系,这也是传统三层架构的一种缺点.这种自上而下的依赖关系会导致级联修改,如果低层发生变化,可能上面所有的层都需要去修改,而且这种传统的三层架构也很难实现团队的协同开发,因为上层功能取决于下层功能的实现,下面功能如果没有开发完成,则上层

英文术语

URL(Uniform Resource Locator)统一资源定位符 URI(Uniform Resource Identifier)通用资源标识符 AJAX(Asynchronous JavaScript And Xml) 异步的 JavaScript and Xml AWT(Abstract Window Toolkit)抽象窗口工具包 JNI:Java Native Interface JAVA本地调用 IoC:Inversion of Control 控制反转 AOP:Aspect

Spring+hibernate+struts

一.Spring 1.概念: 容器:容器可以装载对象,实例化对象,配置对象之间的依赖关系. IOC/DIIOC:Inversion of Control(控制反转),是指程序之间的依赖关系由依赖具体实现(如DISKUSB,UUSB),变为依赖抽象接口(USB).         一句话:依赖抽象非具体.DI:Dependency Injection(依赖注入),是指程序之间的依赖关系由容器动态注入,而非硬编码实现.        Spring里的所有类都是JavaBean,Bean就像项链的柱子

浅谈IOC--说清楚IOC是什么

http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1.IOC的理论背景 2.什么是IOC 3.IOC也叫依赖注入(DI) 4.IOC的优缺点 5.IOC容器的技术剖析 6.IOC容器的一些产品 7.参考博文 本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛.大虾们看到这里可以绕行了,以免浪费您宝贵的时间.IOC这个东西DebugLZQ早就想写了,但是出于对文章权威性的考虑(不能误

项目中的相关英文名词总结

1.JPA:java Persistence API (Java持久化接口,是一个规范) 2.Restful API: Respresentational State Transfer API(表现层状态转换接口,理解为网络与软件结合后的交互协议) 3.AOP:Aspect Oriented Programming(面向切面编程) 4.DI:Dependency Injection (依赖注入,可理解为在使用对象之前声明一下,到用的时候可以直接拿来用,不用自己new了) 5.IOC:Invers

spring框架面试相关问题

Spring 框架中核心组件有三个:Core.Context 和 Beans.其中最核心的组件就是Beans, Spring提供的最核心的功能就是Bean Factory. Spring 解决了的最核心的问题就是把对象之间的依赖关系转为用配置文件来管理,也就是Spring的依赖注入机制.这个注入机制是在Ioc 容器中进行管理的. Bean 组件是在 Spring 的 org.springframework.beans 包下.这个包主要解决了如下功能:Bean 的定义.Bean 的创建以及对 Be