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

题意:

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

分析:

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

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

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

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 const int maxn = 1e5 + 5;
 6
 7 __int64 cnt,k;
 8 int a[maxn],c[maxn];
 9
10
11 void merge(int* a,int first,int mid,int last,int* c) {
12     int i = first,j=mid+1;
13     int m = mid,n=last;
14     int k = 0;
15     while(i<=m||j<=n) {
16         if(j>n||(i<=m&&a[i]<=a[j])) {
17             c[k++] = a[i++];
18         }
19         else {
20             c[k++] = a[j++];
21             cnt += (m-i+1);
22         }
23     }
24     for(i=0;i<k;i++)
25         a[first+i] = c[i];
26 }
27
28 void mergeSort(int* a,int first,int last,int* c) {
29     if(first<last) {
30         int mid = (first+last)/2;
31         mergeSort(a,first,mid,c);
32         mergeSort(a,mid+1,last,c);
33         merge(a,first,mid,last,c);
34     }
35 }
36
37 int main()
38 {
39     int n;
40     while(~scanf("%d%I64d",&n,&k)) {
41         for(int i=0;i<n;i++)
42             scanf("%d",&a[i]);
43         memset(c,0,sizeof(c));
44         cnt = 0;
45         mergeSort(a,0,n-1,c);
46         printf("%lld\n",max(cnt-k,0LL));
47     }
48     return 0;
49 }

View Code

转载于:https://www.cnblogs.com/TreeDream/p/6822322.html

HDU 4944 逆序数对相关推荐

  1. hdu 2838求逆序数开了两个数组

    http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    ...

  2. 【归并排序】【逆序数】HDU 5775 Bubble Sort

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...

  3. HDU 5775 Bubble Sort(归并排序+逆序数)

    题目链接:HDU 5775 Bubble Sort                                                                           ...

  4. hdu 1394(树状数组求逆序数)

    解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...

  5. HDU 4911 Inversion 树状数组求逆序数对

    显然每次交换都能降低1 所以求出逆序数对数,然后-=k就好了.. . _(:зゝ∠)_ #include<stdio.h> #include<string.h> #includ ...

  6. hdu 5273 Dylans loves sequence 逆序数 区间dp

    点击打开链接 题意:给n个数,q次询问,(L,R)区间内的逆序数. 思路: 区间dp 代码一: 1 #include <bits/stdc++.h> 2 using namespace s ...

  7. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

  8. 树桩数组求逆序数+离散化(数太大)

    http://acm.hdu.edu.cn/showproblem.php?pid=3743 求a1 a2 a3 ...an此序列的逆序数 怎么离散化? 首先将序列由小到大排序, 用排序后该数的位置代 ...

  9. 八数码问题中的逆序数

    转载自:http://blog.csdn.net/ju136/article/details/6876647(选取部分). 对于给定八数码棋局的初始状态,我们的目标是通过交换空格与其相邻棋子使棋盘达到 ...

最新文章

  1. 算法--运算的最小翻转次数
  2. 蓝桥杯_算法训练_ALGO10_集合运算
  3. 【Python】利用 Python 分析了一波月饼,我得出的结论是?
  4. 深度学习到底有多难?掌握方法很重要!
  5. 钉钉小程序数据传递——子传父,父传子
  6. docker 查看实时日志
  7. 装饰器,迭代器,生成器
  8. iOS开发之TableView去掉单个cell的间隔线和去掉全部间隔线和去掉tableView多余的间隔线
  9. c语言开发实际,21实际c语言教程-1 (转)
  10. win10远程桌面配置
  11. office高级应用与python综合案例教程_使用Python操作Office——EXCEL
  12. Linux一些基本概念
  13. 【Hadoop】Hadoop大数据架构及关键组件
  14. 奈奎斯特与香农定理_奈奎斯特定理和香农定理有什么区别?
  15. docker-compose安装kafka
  16. 海康iSecure Center 综合安防管理平台安装部署教程 - CentOS系统
  17. 台式计算机可以接收无线不,台式电脑无线接收器插上连不上网怎么处理
  18. java实现图表步骤_Java 在PPT中添加混合图表过程详解
  19. JS中关于字符串返回的操作
  20. 74道高级Java面试合集:yapidocker安装插件

热门文章

  1. mysql dba系统学习(8)查询日志文件功能 mysql dba系统学习(9)slow query log慢查询日志功能
  2. Python常见问题(2):编程问题 Programming FAQ
  3. 2015年58同城面试题
  4. Ubuntu安装搜狗输入法Linux版
  5. [JVM]常用JVM工具使用
  6. Ambrosus宣布推出用于Web Apps、iOS、Android的源代码开发套件
  7. 微信公众平台开发(24) 自定义菜单功能开发
  8. Exchange 2007 迁移 2010
  9. Eclipse中将Java项目转换成Web项目的方法
  10. 界面之间是如何传值的