poj2299 Ultra-QuickSort
来源:互联网 发布:python主函数 编辑:程序博客网 时间:2024/05/23 07:23
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int n;struct node{ int val; int num;//编号}inPut[500050];//用于处理输入的数组int a[500050];//离散化后的数组int c[500050];//数状数组int lowbit(int i){ return i&(-1*i);}void insert(int i)//维护树状数组{ while(i<=n) { c[i]++; i+=lowbit(i); }}bool cmp(node a,node b){ return a.val<b.val;}int getsum(int x)//计算小于等于x的个数{ int ans=0; for(int i=x;i>=1;i-=lowbit(i)) { ans+=c[i]; } return ans;}int main(){ while(cin>>n,n) { for(int i=1;i<=n;i++) { cin>>inPut[i].val; inPut[i].num=i; } //离散化 sort(inPut+1,inPut+n+1,cmp); for(int i=1;i<=n;i++) { a[inPut[i].num]=i; } //离散化完成 memset(c,0,sizeof(c)); long long ans=0; for(int i=1;i<=n;i++) { insert(a[i]);//将该数据插入到树状数组中 ans+=i-getsum(a[i]);//i表示当前插入树状数组的元素个数,getsum处理出了已插入的数中小于等于当前的数的个数 } cout<<ans<<endl; } return 0;}
题意:
描述:
在这个问题中,你必须去分析一个特殊的排序算法。这个算法处理n个数,通过不断交换两个相邻的数,直至这个n个数成升序排列
比如输入序列:
9 1 0 5 4
目标序列是
0 1 4 5 9
你的任务是计算需要交换多少次
对样例
9 1 0 5 4
离散化为
5 2 1 4 3
- poj2299 Ultra-QuickSort
- (POJ2299)Ultra-QuickSort
- poj2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- POJ2299-Ultra-QuickSort
- POJ2299:Ultra-QuickSort
- poj2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- poj2299--Ultra-QuickSort
- poj2299—Ultra-QuickSort
- POJ2299 Ultra-QuickSort
- POJ2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- POJ2299 Ultra-QuickSort
- POJ2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort
- 根据数组中数字出现频率排序
- brut.androlib.err.UndefinedResObject(完美解决)apktool反编译问题
- 在vSphere上通过BOSH工具大规模部署Cloud Foundry (1) - IaaS准备
- criteria 概述
- 花花公子推荐伤感qq日志:乖不哭,我拜你
- poj2299 Ultra-QuickSort
- T-Sql查询小计总结
- Linux 忘记登陆密码怎么办?
- 小米2013校园招聘笔试题_JAVA版本
- STP协议的形象化理解
- MPlayer配置文件
- MATLAB帮助文档_Simulink产品_Simulink Products
- JAVA.SWT/JFace: SWT高级控件之SWT系统资源
- 第一份工作总结