题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911

题意:

给出一个序列,可以相邻的交换k次,求 k 次之后,逆序数对最少是多少;

分析:

可以发现,无论怎么交换之后,总共的逆序数对只会-1,那么结果就是,将这个序列排整齐时,要两两交换的次数-k;题目就转换为求这个序列的逆序数对有多少;

这样的两两交换好像是冒泡排序,冒泡排序是O(n^2);

正确解法是归并排序;当我们合并两个有序序列时,如果,要将后面的插入到前一个中间,那么这里就有m-i+1个逆序数对;

 #include <bits/stdc++.h>

 using namespace std;

 const int maxn = 1e5 + ;

 __int64 cnt,k;
int a[maxn],c[maxn]; void merge(int* a,int first,int mid,int last,int* c) {
int i = first,j=mid+;
int m = mid,n=last;
int k = ;
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+);
}
}
for(i=;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)/;
mergeSort(a,first,mid,c);
mergeSort(a,mid+,last,c);
merge(a,first,mid,last,c);
}
} int main()
{
int n;
while(~scanf("%d%I64d",&n,&k)) {
for(int i=;i<n;i++)
scanf("%d",&a[i]);
memset(c,,sizeof(c));
cnt = ;
mergeSort(a,,n-,c);
printf("%lld\n",max(cnt-k,0LL));
}
return ;
}

最新文章

  1. &lt;开心一笑&gt; 码农 黑客和2B程序员之间的区别
  2. mysql 存储 emoji报错( Incorrect string value: &#39;\xF0\x9F\x98\x84\xF0\x9F)的解决方案
  3. flashback table恢复数据
  4. sql之独立子查询和相关子查询总结
  5. Java中方法的重载
  6. CodeForces 592B
  7. list集合接口
  8. MPEG-DASH on IIS Practice in Action
  9. 【Qt编程】Qt学习笔记&lt;三&gt;
  10. 忘记秘密利用python模拟登录暴力破解秘密
  11. Idea突然不停indexing的问题
  12. 第十七章 java8特性
  13. win10升级至专业版
  14. 【读书笔记】iOS-网络-负载
  15. 牛客网-《剑指offer》-跳台阶
  16. ios中webview的高级用法
  17. 传递 hdu 5961 拓扑排序有无环~
  18. linux介绍及基本命令
  19. pytest文档1-环境准备与入门
  20. Oracle Package

热门文章

  1. 采用MQTT协议实现android消息推送(3)选ActiveMQ当服务端
  2. vue之element-ui文件上传
  3. oracle 备份恢复篇(四)---rman 单个数据文件
  4. NPOI开发手记
  5. PHP一维数组去重方法array_unique()
  6. IDEA 中,编译后不拷贝 mybatis 配置的 mapper 的 xml 文件
  7. Jvav Collection-List
  8. (三)TestNG
  9. 如何设计一个“高大上”的 logo
  10. 关于微信小程序的动态跳转