逆序对解决方法之归并排序
2016-03-24 12:54
225 查看
逆序对即是对于i < j ,ai>aj的(i,j)树对的个数,那么先求出每
个j中i < j ai < aj的i的个数,那么j-i的和即是逆序对总数。
归并排序中 bi ( 0 <= i < n/2) ci(n/2 <= i < n)
则有三种情况:
1,bi中的逆序对数
2,ci中的逆序对数
3,一个在bi,另一个在ci的逆序对数
个j中i < j ai < aj的i的个数,那么j-i的和即是逆序对总数。
归并排序中 bi ( 0 <= i < n/2) ci(n/2 <= i < n)
则有三种情况:
1,bi中的逆序对数
2,ci中的逆序对数
3,一个在bi,另一个在ci的逆序对数
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int>v; //归并排序 ll merge_count(vector<int>& a){ int n=a.size(); if(n<=1) return 0; ll cnt=0; //b,c集合分别为a集合的前半部分与后半部分 vector<int> b(a.begin(),a.begin()+n/2); vector<int> c(a.begin()+n/2,a.end()); cnt+=merge_count(b);//先将b集合排好序 cnt+=merge_count(c);//再将c排好 int ai=0,bi=0,ci=0; //将b,c合并 while(ai<n){ if(bi<b.size() && (ci==c.size() || b[bi]<c[ci])){ a[ai++]=b[bi++]; }else{ cnt+=n/2-bi; a[ai++]=c[ci++]; } } return cnt; } int main() { int n; cin>>n; int x; for(int i=0;i<n;i++){ cin>>x; v.push_back(x); } ll ans=merge_count(v); for(int i=0;i<n;i++){ cout<<v[i]<<" "; } cout<<endl; cout<<ans<<endl; }
相关文章推荐
- snappy 1.1.3-bin x86 解压缩工具
- Linux命令-进程后台执行:nohup(就是不挂起的意思)
- 可重入函数与线程安全
- 关于前端的一点点感触
- android 广告平台 keymob
- 【管理心得之六十】制定项目计划不是只有时间才做的一种点缀
- 测试!用于分析一个字符串中各个单词出现的频率!
- Codeforces 367E Sereja and Intervals (dp + sqrt)
- 浅析onsubmit校验表单时利用ajax的return false无效问题
- Maxout的深入理解
- 小米note开启调试模式
- RxJavaRxAndroid入门资料 基本方法
- binlog怎样参与mysql recover的
- 搜索引擎根据原Sphider的脚本修正后的 Sphider-plus 2.2
- GOOGLE VR SDK开发VR游戏,VR播放器之一
- MySQL 5.7 root登录问题
- 欢迎使用CSDN-markdown编辑器
- 移動圖片自適應
- ssh 远程执行命令简介
- android bitmap设置图片内存溢出的解决神器