nyoj 117 求逆序数
2016-04-19 17:21
344 查看
———-nyoj 117 求逆序数
1.归并排序:
2.树状数组处理:
引用自:离散化+树状数组
1.归并排序:
#include<stdio.h> int A[1000001],T[1000001];long long count=0; void merge_s(int *A,int x,int y,int *T) { if(x==y) return ; int m=(x+y)>>1; merge_s(A,x,m,T); merge_s(A,m+1,y,T); int i=x,j=m+1,pos=x; while(i<=m&&j<=y){ if(A[i]<=A[j]) T[pos++]=A[i++]; else {T[pos++]=A[j++];count+=m-i+1;} } while(i<=m) T[pos++]=A[i++]; while(j<=y) T[pos++]=A[j++]; for(i=x;i<=y;i++) A[i]=T[i]; } int main() { int t,N,i;scanf("%d",&t); while(t--) { count=0; scanf("%d",&N); for(i=0;i<N;i++) scanf("%d",&A[i]); merge_s(A,0,N-1,T); printf("%lld\n",count); } return 0; }
2.树状数组处理:
引用自:离散化+树状数组
#include <iostream> #include <cstring> #include <cstdio> #include using namespace std; const int N = 1000005; int reflect ,c ,n; struct node { int val; int pos; }s ; bool cmp(node 4000 x,node y) { if(x.val == y.val) return x.pos < y.pos; return x.val < y.val; } int lowbit(int x) { return x&(-x); } void update(int x) { while(x <= n) { c[x] += 1; x += lowbit(x); } } long long getsum(int x)//统计比x小的数 { long long sum = 0; while(x > 0) { sum += c[x]; x -= lowbit(x); } return sum; } int main() { int T,i; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&s[i].val), s[i].pos = i; sort(s+1,s+n+1,cmp); for(i = 1; i <= n; i ++) reflect[s[i].pos] = i; memset(c,0,sizeof(c)); long long ans = 0; for(i = 1; i <= n; i ++) { update(reflect[i]); ans += i - getsum(reflect[i]);//i表示已经插入的数的个数 } printf("%lld\n",ans); } return 0; }
相关文章推荐
- java实现归并排序算法
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现自顶向下的归并排序算法
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- leetcode 虐我篇之(二) Two Sum
- In-place Merge Sort 原地并归排序
- 使用Java完成《算法导论》习题2.3-2
- 插入排序移动次数
- 归并排序 with Python
- 归并排序-逆序对的求解
- 排序算法的复杂度和稳定性
- 用python实现归并排序