poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)
2015-08-26 19:42
513 查看
题意:给一个数组,计算需要的冒泡排序的次数,元素个数很大,不能用n^2的冒泡排序计算。
解析:这题实际上就是求逆序对的个数,可以用归并排序的方法,我这里用另一种方法写,bit树+离散化。由于元素的值可以达到很大,但元素个数最多只有500000个,可以先对这些数排序,离散化一下,比如5个数:1 5 8 233333333 122222,排序后他们对应的标号可以是1 2 3 5 4;每次插入一个数时add(val,1),计算该数以及之前所有的数的个数sum(val);那么逆序对的个数=当前这个数的位置-sum(val); 扫一遍即可。
代码如下:
解析:这题实际上就是求逆序对的个数,可以用归并排序的方法,我这里用另一种方法写,bit树+离散化。由于元素的值可以达到很大,但元素个数最多只有500000个,可以先对这些数排序,离散化一下,比如5个数:1 5 8 233333333 122222,排序后他们对应的标号可以是1 2 3 5 4;每次插入一个数时add(val,1),计算该数以及之前所有的数的个数sum(val);那么逆序对的个数=当前这个数的位置-sum(val); 扫一遍即可。
代码如下:
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #include<iterator> #include<utility> #include<sstream> #include<iostream> #include<cmath> #include<stack> using namespace std; const int INF=1000000007; const double eps=0.00000001; typedef __int64 LL; int N; int A[500001],pos[500001],elem[500001]; int lowbit(int x){ return x&-x; } int sum(int id) { int ret=0; while(id>0){ ret+=elem[id]; id-=lowbit(id); } return ret; } void add(int id,int val) { while(id<=N){ elem[id]+=val; id+=lowbit(id); } } vector<int> save; int main() { while(scanf("%d",&N)!=EOF&&N) { save.clear(); memset(elem,0,sizeof(elem)); for(int i=1;i<=N;i++) { scanf("%d",&A[i]); save.push_back(A[i]); } sort(save.begin(),save.end()); for(int i=1;i<=N;i++) { pos[i]=lower_bound(save.begin(),save.end(),A[i])-save.begin()+1; //离散化 } LL ans=0; for(int i=1;i<=N;i++) { add(pos[i],1); //插入这个数 ans+=i-sum(pos[i]); //计算逆序对个数 } cout<<ans<<endl; } return 0; }
相关文章推荐
- MySQL Query 的优化—合理设计并利用索引
- KendoUI之kendoGrid服务端分页
- UITableViewDelegate
- 【HDOJ 1005】 Number Sequence (裸矩阵快速幂)
- poj1458-Common Subsequence(最长公共子序列,LCS)
- hibernate4中使用createSQLQuery方法执行sql语句的用法
- ios UITableView中Cell的重用机制
- UI基础_transform
- UESTC 594 我要长高 单调队列优化DP
- MUI - 封装localStorage与plus.storage
- deque与vector的主要区别
- 创建虚拟机 Guest Is already in use 处理办法
- 百度编辑器ueditor初始化赋值
- IOS-笔记15(Unwind Segue,Action Sheets,Alert,NSTimer)
- 设置UIButton的文字显示位置、字体的大小、字体的颜色
- UICollectionView(loading...)
- DuiLib属性
- 适配iPhone6和6P UITableView分割线会闪动(拖动UITableView的时候,分割线 一会儿变粗一会儿变细)解决办法
- iOS中UI适配问题
- Android UI--自定义ListView(实现下拉刷新+加载更多)