Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 46902 | Accepted: 17116 |
Description
![](https://i-blog.csdnimg.cn/blog_migrate/b3530eaa8fa98ef394d3639722240a8c.jpeg)
Ultra-QuickSort produces the output
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
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
求冒泡排序交换的次数
所求的数==逆序数的个数
统计一下,每个数之前有多少个比他大的数就可以,用树状数组存储一下,按从小到大的顺序排序,这个数在树状数组中+1,统计在新的排序顺序下每个数之前的区间和,也就有在这个数原来的位置之前有多少数比他小,用原来的位置-这个数就是这个数之前比他大的数 存到最后的答案中
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define Max 500010
int lowbit(int a)
{
return a&(-a);
}
int c[Max],v[Max];
struct pt
{
int pos,val;
}e[Max];
long long n,sum;
bool cmp(pt a, pt b)
{
return a.val<b.val;
}
void update(int x)
{
while(x<=n)
{
c[x]+=1;
x+=lowbit(x);
}
return ;
}
int getsum(int x)
{
int res=0;
while(x>0)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
int main()
{
while(cin>>n)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
cin>>e[i].val;
e[i].pos=i;
}
sum=0;
sort(e+1,e+n+1,cmp);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++) v[e[i].pos]=i;
for(int i=1;i<=n;i++)
{
update(v[i]);
sum+=i-getsum(v[i]);
}
cout<<sum<<endl;
}
return 0;
}