HDU 4944 逆序数对
题目链接: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 逆序数对相关推荐
- hdu 2838求逆序数开了两个数组
http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Time Limit: 2000/1000 MS (Java/Others) ...
- 【归并排序】【逆序数】HDU 5775 Bubble Sort
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...
- HDU 5775 Bubble Sort(归并排序+逆序数)
题目链接:HDU 5775 Bubble Sort ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
- HDU 4911 Inversion 树状数组求逆序数对
显然每次交换都能降低1 所以求出逆序数对数,然后-=k就好了.. . _(:зゝ∠)_ #include<stdio.h> #include<string.h> #includ ...
- hdu 5273 Dylans loves sequence 逆序数 区间dp
点击打开链接 题意:给n个数,q次询问,(L,R)区间内的逆序数. 思路: 区间dp 代码一: 1 #include <bits/stdc++.h> 2 using namespace s ...
- hdu 1394 线段树计算逆序数
线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...
- 树桩数组求逆序数+离散化(数太大)
http://acm.hdu.edu.cn/showproblem.php?pid=3743 求a1 a2 a3 ...an此序列的逆序数 怎么离散化? 首先将序列由小到大排序, 用排序后该数的位置代 ...
- 八数码问题中的逆序数
转载自:http://blog.csdn.net/ju136/article/details/6876647(选取部分). 对于给定八数码棋局的初始状态,我们的目标是通过交换空格与其相邻棋子使棋盘达到 ...
最新文章
- 算法--运算的最小翻转次数
- 蓝桥杯_算法训练_ALGO10_集合运算
- 【Python】利用 Python 分析了一波月饼,我得出的结论是?
- 深度学习到底有多难?掌握方法很重要!
- 钉钉小程序数据传递——子传父,父传子
- docker 查看实时日志
- 装饰器,迭代器,生成器
- iOS开发之TableView去掉单个cell的间隔线和去掉全部间隔线和去掉tableView多余的间隔线
- c语言开发实际,21实际c语言教程-1 (转)
- win10远程桌面配置
- office高级应用与python综合案例教程_使用Python操作Office——EXCEL
- Linux一些基本概念
- 【Hadoop】Hadoop大数据架构及关键组件
- 奈奎斯特与香农定理_奈奎斯特定理和香农定理有什么区别?
- docker-compose安装kafka
- 海康iSecure Center 综合安防管理平台安装部署教程 - CentOS系统
- 台式计算机可以接收无线不,台式电脑无线接收器插上连不上网怎么处理
- java实现图表步骤_Java 在PPT中添加混合图表过程详解
- JS中关于字符串返回的操作
- 74道高级Java面试合集:yapidocker安装插件