Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 67316 Accepted: 25208
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
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
//这个题主要有一点挺坑的 就是最后的答案 ans 可能很大 需要用long long 类型来存储 其他的就是树状数组求逆序数
sum[i] 代表着1 …i 的和 其中 i- sum[i] 代表着有i-sum[i] 个数 比i 大
由于本题的a[i] 并不是1..n之间的数 所以只能是将其离散化 将下标进行存储
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int sum[500007];
int n;
vector<int> vv;
int tmp[500007];
int lowbit(int x)
{
return x & (-x);
}
void Insert(int pos,int x)
{
while(pos <= n)
{
sum[pos] += x;
pos += lowbit(pos);
}
}
int getsum(int pos)
{
int ans = 0;
while(pos > 0)
{
ans += sum[pos];
pos -= lowbit(pos);
}
return ans;
}
int getIndex(int x)//离散化下标
{
return lower_bound(vv.begin(),vv.end(),x) - vv.begin() + 1;
}
int main()
{
while(cin>>n)
{
if(n==0) break;
memset(sum,0,sizeof(sum));
vv.clear();
for(int i =1;i<=n;i++)
{
scanf("%d",&tmp[i]);
vv.push_back(tmp[i]);
}
sort(vv.begin(),vv.end());//为了进行二分查找
vv.erase(unique(vv.begin(),vv.end()),vv.end());//擦掉vv 里面重复的值
long long ans = 0;
for(int i =1;i<=n;i++)
{
int indx = getIndex(tmp[i]);
Insert(indx,1);
ans += (i - getsum(indx));
}
printf("%lld\n",ans);
}
return 0;
}