【结论】升序逆序对
来源:互联网 发布:长春淘宝培训班资质 编辑:程序博客网 时间:2024/05/16 01:32
求法:
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)、离散化
0 0
- 【结论】升序逆序对
- 升序和逆序输出
- 逆序数 & 逆序对
- java 升序 逆序 前移 后移
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- 逆序对
- BZOJ1016 [JSOI2008]最小生成树计数
- 306. Additive Number 给定字符串分割进行类似斐波那契数列
- BZOJ1269——[AHOI2006]文本编辑器editor
- 经验
- shell命令列表
- 【结论】升序逆序对
- lcd framebuffer 编程
- AIX修改密码报错3004-314
- Java程序设计笔记
- RDF入门
- 同步转异步+RPC的一个POS行业应用-关键技术实现
- 《青春志》感
- 详讲超过255台电脑的内网IP规划问题
- (4.6.15)千万级用户的 Android 客户端是如何养成的