归并排序逆序对+快读
2020-04-05 12:15
85 查看
归并排序模版
使用前须将cnt置为0
void merge_sort(int *A,int x,int y,int *T,int &cnt) { if(y-x>1) { int m = x+(y-x)/2; int p = x,q = m,i = x; merge_sort(A,x,m,T,cnt); merge_sort(A,m,y,T,cnt); while(p<m || q<y) { if(q >= y || (p<m && A<=A[q])) T[i++] = A[p++]; else {T[i++] = A[q++];cnt += m - p; } } for(int i = x;i < y;i++)A[i] = T[i]; } }
逆序对解释:
[p]因为数组是从小到大复制的,从A[q]A[q]A[q]复制到T[i]T[i]T[i]时,左边还没来得及复制的那一些一些就是左边所有比A[q]A[q]A[q]大的数,此时只需要在**左边加上m−pm-pm−p**即可。###快读模版
inline int read() { int x = 0,f = 1;char c = getchar(); while(!isdigit(c)){if(c=='-')f=-1;else f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } inline void write_num(int x) { if(x>9)write_num(x/10); putchar((x%10)+48); } inline void write(int x) { if(x < 0)putchar('-'),x=-x; write_num(x); }
test
####以下便是完整的代码~~,欢迎拍砖~~
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int a[maxn],t[maxn]; void merge_sort(int *A,int x,int y,int *T,int &cnt) { if(y-x>1) { int m = x+(y-x)/2; int p = x,q = m,i = x; merge_sort(A,x,m,T,cnt); merge_sort(A,m,y,T,cnt); while(p<m || q<y) { if(q >= y || (p<m && A[p]<=A[q])) T[i++] = A[p++]; else {T[i++] = A[q++];cnt += m - p; } } for(int i = x;i < y;i++)A[i] = T[i]; } } inline int read() { int x = 0,f = 1;char c = getchar(); while(!isdigit(c)){if(c=='-')f=-1;else f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } inline void write_num(int x) { if(x>9)write_num(x/10); putchar((x%10)+48); } inline void write(int x) { if(x < 0)putchar('-'),x=-x; write_num(x); }int main() { int n = read(),cnt = 0; for(int i = 0;i < n;i++) a[i] = read(); merge_sort(a,0,n,t,cnt); write(cnt),putchar('\n'); for(int i = 0;i < n;i++) write(a[i]),putchar(' '); return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 利用归并排序求逆序对
- 归并排序求逆序对数
- hiho 39 二分·归并排序之逆序对
- 百练+归并排序求逆序数+注意最后是按逆序数大小输出原来的序列啊!
- 归并排序 + 逆序数
- 归并排序顺带求逆序对
- java归并排序解逆序问题
- 面试题36:数组中的逆序对(归并排序思想)
- POJ 2299 求逆序对个数 归并排序 Or数据结构
- HIHO #1141 : 二分·归并排序之逆序对
- 哈理工OJ 2224 逆序对问题(利用归并排序求逆序数对数)
- 归并排序以及逆序对统计
- 归并排序求逆序数
- 归并排序求逆序对数 (附另两种姿势BIT 线段树)
- 归并排序求逆序对
- nyoj 117 求逆序数【线段树 树状数组 归并排序】
- poj 2299 树状数组+离散化 or 归并排序 求逆序对
- POJ 2299 归并排序 求逆序对数
- poj-2299-Ultra-QuickSort-归并排序求逆序数--或树状数组
- NYOJ 117 求逆序数【归并排序求逆序数】