Ultra-QuickSort--POJ2299(归并排序求逆序数对)
2016-05-09 11:32
501 查看
http://poj.org/problem?id=2299
归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上
述方法逐步缩小序列,先使子序列有序,再使子序列区间有序,然后再把有序区间合并,很好滴体现了分治的思想。
逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与a[j]为逆序数对)
归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上
述方法逐步缩小序列,先使子序列有序,再使子序列区间有序,然后再把有序区间合并,很好滴体现了分治的思想。
逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与a[j]为逆序数对)
#include<stdio.h> #include<algorithm> #include<math.h> #include<cstring> #include<cstdlib> #include<queue> #include<iostream> using namespace std; #define N 500050 #define memset(a,b) memset(a,b,sizeof(a)) long long cont; int a ,b ; void merge(int l,int r) { if(l>=r) return; int mid=(l+r)/2; merge(l,mid); merge(mid+1,r); int x=l; int y=mid+1,i=l; while(x<=mid || y<=r) { if(y>r || (x<=mid && a[x]<a[y])) b[i++]=a[x++]; else { if(x<=mid) cont+=mid-x+1; b[i++]=a[y++]; } } for(i=l;i<=r;i++) a[i]=b[i]; } int main() { int n; while(scanf("%d",&n),n) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } cont=0; merge(0,n-1);///归并排序 printf("%lld\n",cont); } return 0; }
相关文章推荐
- UIButton setBackgroundImage与setImage区别
- UITabBarController使用
- android 你所不知道的类SpannableStringBuilder的总结--实现图文混排,查看更多,下划线等等
- Moqui之时间转换
- words in view Moqui resource code
- 区分Integer.getInteger和Integer.valueOf、Integer.parseInt() 的使用方法
- TestSuite很多skipped,报错Exception org.openqa.selenium.SessionNotCreatedException
- 专访|腾讯、阿里、adidas的服务方UID WORKS
- sdutoj 3252 Lowest Unique Price
- Android UI 优化 使用<include/>和 <merge />标签
- QtGuid4.dll处有未经处理的异常,0xsdddddd5写入位置错误
- om.android.builder.model.SourceProvider.getShadersDirectories() not found
- Moqui学习之代码分析mantle priceServices.xml
- TabBar高度修改以及UITabBarItem坐标移动
- 界面设计,事件处理--GUI编程的核心--
- Implement Stack using Queues
- CRM开发要点(三)
- MUI卸载动画——粒子爆炸
- sudo: must be setuid root
- php 获取提交的数据 $_REQUEST = $_GET + $_POST + $_COOKIE