博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2299 Ultra-QuickSort(树状数组)(离散化)
阅读量:2133 次
发布时间:2019-04-30

本文共 2207 字,大约阅读时间需要 7 分钟。

Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 56014   Accepted: 20694

Description

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence  
9 1 0 5 4 ,
Ultra-QuickSort produces the output  
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

Input

The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

Output

For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

Sample Input

59105431230

Sample Output

60

Source

  树状数组求逆序数。由于数组元素最大达到999,999,999,所以不能直接开数组,要先用“离散化”的方法将数组元素映射成1~n,再进行一般的树状数组操作。

#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = 500005;struct node{ int val,pos;}nod[N];int C[N],r[N];int n;bool cmp(node a,node b){ return a.val < b.val;}int lowbit(int t){ return t&(-t);}void add(int t){ while(t <= n) { C[t] += 1; t += lowbit(t); }}//求得前面小于当前的数的个数int getnum(int t){ int ans = 0; while(t > 0) { ans += C[t]; t -= lowbit(t); } return ans;}int main(){ while(~scanf("%d",&n) && n) { memset(C,0,sizeof(C)); for(int i = 1;i <= n;i++) { scanf("%d",&nod[i].val); nod[i].pos = i; } sort(nod+1, nod+1+n,cmp);//先sort for(int i = 1;i <= n;i++)//离散化处理 r[nod[i].pos] = i; ll ans = 0,k; for(int i = 1;i <= n;i++) { add(r[i]); k = i - getnum(r[i]); ans += k; } printf("%lld\n",ans); } return 0;}

转载地址:http://wqzgf.baihongyu.com/

你可能感兴趣的文章
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
VS生成DLL文件供第三方调用
查看>>
Android Studio color和font设置
查看>>
Python 格式化打印json数据(展开状态)
查看>>
Centos7 安装curl(openssl)和libxml2
查看>>
Centos7 离线安装RabbitMQ,并配置集群
查看>>