首页 > 代码库 > POJ 2299 Ultra-QuickSort(归并排序求逆序对数)
POJ 2299 Ultra-QuickSort(归并排序求逆序对数)
题目地址:POJ 2299
今天下午的多校看来没有白做。。。实在做不出题闲着无聊看小白鼠学会了个归并排序。哈哈。
归并排序简单地说其实就是先分成一个二叉树直至单个,然后依次从最底层不断进行合并,逆序对数就是在合并的过程中,加入后面的那段中到了比他大的时候,那后面的那些就都是比他大的,都是逆序对数,所以直接加上即可。网上资料很多,就不细说了。。用了分治的思想。
自己根据理解写的代码,考虑的太不全面了。。又调了好长时间。。。
代码如下:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> int a[6000000], cnt, c[6000000]; long long k; void merg(int low, int mid, int high) { int i=low, j=mid+1; cnt=0; while(i<=mid&&j<=high) { if(a[i]>a[j]) { c[cnt++]=a[j++]; k+=mid-i+1; } else { c[cnt++]=a[i++]; } } while(i<=mid) { c[cnt++]=a[i++]; } while(j<=high) { c[cnt++]=a[j++]; } cnt=0;i=low; while(i<=high) { a[i++]=c[cnt++]; } } void merger(int low, int high) { int mid; if(low<high) { mid=(low+high)/2; merger(low,mid); merger(mid+1,high); merg(low,mid,high); } } int main() { int i, n; while(scanf("%d",&n)!=EOF&&n) { k=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); } merger(0,n-1); printf("%lld\n",k); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。