【结论】升序逆序对
2016-07-13 20:07
197 查看
求法:
1、归并排序
2、树状数组
(1)、当数字范围大于0且不大时,直接求
(2)、离散化
1、归并排序
#include<iostream> #include<cstdio> using namespace std; int a[10003],a1[10003]; int ans=0; void merge(int l,int mid,int r) { int i=l,k=l,j=mid+1; while(i<=mid&&j<=r) { if(a[i]<=a[j]) a1[k++]=a[i++];// < else { a1[k++]=a[j++]; ans+=mid-i+1; } } while(i<=mid) a1[k++]=a[i++]; while(j<=r) a1[k++]=a[j++]; for(i=l;i<=r;i++) a[i]=a1[i]; } void mergesort(int l,int r) { if(l<r) { int mid=(l+r)>>1; mergesort(l,mid); mergesort(mid+1,r); merge(l,mid,r); } } int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); mergesort(1,n); printf("%d",ans); }
2、树状数组
(1)、当数字范围大于0且不大时,直接求
#include<cstdio> #include<iostream> using namespace std; const int need=20003;//数字范围为20000; int c[need]; int ans=0; inline int lowbit(int s){return s&-s;} int getsum(int x) { int cnt=0; for(int i=x;i>0;i-=lowbit(i)) cnt+=c[i]; return cnt; } void modify(int x) { for(int i=x;i<need;i+=lowbit(i)) c[i]++; } int main() { int n;scanf("%d",&n); for(int i=1,d;i<=n;i++) { scanf("%d",&d); ans+=getsum(need-1)-getsum(d);// getsum(d-1) modify(d); } printf("%d",ans); }
(2)、离散化
相关文章推荐
- unity3D引擎:2D游戏自动瞄准算法实现
- gcd
- javascript原理系列— new的原理
- 将 Web 应用性能提高十倍的10条建议
- 设计模式之c++实现(三)
- android自定义 数字键盘2
- Linux基础(9)文本处理三剑客之grep
- 转:理解 Linux 的硬链接与软链接
- windows apache开启url rewrite
- 关于UITextFiled,UIlabel,UIBUtton相关设置,边框设置和字体设置
- day_3-acm贪心(sort结构体排序)
- python列表常见方法
- Ex2010-18 Exclude email address/recipient from Exchange 2010 dynamic distribution group
- C语言的值传递、地址传递、引用传递
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) E DFS
- 网页设计的字体
- 判断一个年份是否是闰年Java初级入门
- HDU2521 求因数个数
- Nginx配置文件nginx.conf中文详解
- LeetCode - 39. Combination Sum