Inversion(hdu 4911)
2015-08-08 15:11
190 查看
此题链接单击这里
=================题意:
有N个数,每次只能和相邻的数交换,只能交换K次,问最少有多少个逆序对(就 是一个数前面有多少个数比它大)。
思路:
用归并排序按升序排列,在排列时记录所有的逆序对。排列完以后用所有的逆序对减K就是行了(注意负数时输出0)
付代码
#include <iostream> #include <cstdio> #include <queue> #include <stack> #include <string> #include <cstring> #include <cmath> using namespace std; long long a[110000]; long long b[110000]; long n; long long cnt; long long l; long long k; void funt(long x,long y) { if(y-x>1){ long m=x+(y-x)/2; long p=x,q=m,i=x; funt(x,m); funt(m,y); while(p<m||q<y) { if(q>=y||(p<m&&a[p]<=a[q])) b[i++]=a[p++]; else { b[i++]=a[q++]; cnt+=m-p; } } for(i=x;i<y;i++) a[i]=b[i]; } } int main() { while(scanf("%ld%lld",&n,&k)==2) { cnt=0; memset(b,0,sizeof(b)); for(long i=0;i<n;i++) scanf("%lld",&a[i]); funt(0,n); if(cnt>k) printf("%lld\n",cnt-k); else cout<<0<<endl; } }
有问题联系企鹅791267032
邮箱地址….wutanrong@Hotmail.com
相关文章推荐
- 周赛 大数
- 模拟 codeforces567B Berland National Library
- Hibernate中get和load方法的区别
- Android学习笔记之常用控件
- codeforces Round #Pi (div.2) 567ABCD
- 模拟电子开关
- 从底层角度看ASP.NET-A low-level Look at the ASP.NET...
- [Wireshark]_003_电子邮件抓包分析
- 黑马程序员——Java基础语法---数组
- Watering Grass
- Maven配置总结
- 黑马程序员---struts2学习笔记之七(表单验证)
- Java泛型总结(1)
- 快排partition过程——索引小修改
- Mysql数据库,表中有中文时,select出来好多问号(?)的解决方法
- Self-information
- JAVA 阻塞队列
- hdu 1003 Max Sum 最大字段和 dp
- 富甲天下3存档修改
- 简历