Inversion

题目链接:

http://acm.hust.edu.cn/vjudge/contest/121349#problem/A

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

##题意:

对有n个元素的数组进行不超过k次操作,每次操作允许交换相邻元素;
求操作后能得到的整个数组的最小逆序数.


##题解:

容易得出每次交换相邻元素最多只能使得逆序数降低1.
而对于一个逆序数不为0的数组,一定存在相邻的两个数满足(i

##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 101000
#define mod 100000007
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;

LL num[maxn];

LL _count=0;

void merge_array(int left,int mid,int right)

{

int temp[right-left+1];int k=0;

int i=left;int j=mid+1;

while(i<=mid&&j<=right)

{

if(num[i]<=num[j])

temp[k++]=num[i++];

else

{temp[k++]=num[j++];_count+=mid-i+1;}

}

while(i<=mid)

temp[k++]=num[i++];

while(j<=right)

temp[k++]=num[j++];

for(i=left;i<=right;i++)
num[i]=temp[i-left];

}

void merge_sort(int left,int right)

{

if(left<right)

{

int mid=left+(right-left)/2;

merge_sort(left,mid);

merge_sort(mid+1,right);

merge_array(left,mid,right);

}

}

int main(void)

{

//IN;

int n;
LL k;
while(scanf("%d %I64d",&n,&k) != EOF)
{
for(int i=0; i<n; i++)
scanf("%I64d",&num[i]);
_count=0;
merge_sort(0, n-1); printf("%I64d\n", max(_count-k,0LL));
}
return 0;

}

最新文章

  1. xp系统重绘边框线不显示(首次加载没有触发paint事件)
  2. 关于mapcontrol和pagelayoutcontrol切换时闪退
  3. window.print实现打印特定控件或内容
  4. 论js闭包的重要性
  5. Javascript 中的false,零值,null,undefined和空字符串对象
  6. Hadoop学习之YARN框架
  7. Apriori算法实现
  8. 数据的分类-JavaScript数据类型
  9. 《Language Implementation Patterns》之 构建语法树
  10. JavaScript splice() 方法和JavaScript split() 方法
  11. 后端程序员必会常用Linux命令总结
  12. CSS3之box-sizing属性
  13. form-layui
  14. Burp Suite Intruder中爆破模式介绍
  15. 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点
  16. C#.Net 持久化对象为XML文件
  17. EXP7 网络欺诈技术防范(修改版)
  18. EntityFramework的安装
  19. Bootstrap(6)辅组类和响应式工具
  20. MySQL数据库封装和分页查询

热门文章

  1. Eclipse中查看JDK源码设置
  2. UVA 11374 Airport Express(最短路)
  3. kendo ui grid控件在选择行时如何取得所选行的某一列数据
  4. HDU 5294 Tricks Device (最短路,最大流)
  5. python中的类和实例
  6. Java Socket(3): NIO
  7. 【转】iOS UITableView的方法解析
  8. Android01--开发环境搭建
  9. Android SDK Manager 更新代理配置 ,蛋碎了
  10. Android Studio如何快速生成get,set,tostring,构造函数