POJ 2299 Ultra-QuickSort(树状数组)
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 60584 Accepted: 22464
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
题解:求逆序对数,可以用归并排序,树状数组实现(离散化:开一个大小为这些数的最大值的树状数组)
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
typedef long long ll;
using namespace std;
const int maxn = 500005;
int n;
int c[maxn],a[maxn],b[maxn];
//val就是原输入的值,pos是下标
// 对结构体按val从小到大排序
//此时,val和结构体的下标就是一个一一对应关系
struct Node
{
int val;
int pos;
bool operator <(const Node &a)
{
return val<a.val;
}
}node[maxn];
int lowbit(int x)
{
return x&(-x);
}
int get_sum(int x)
{
int sum=0;
while(x)
{
sum+=c[x];
x -=lowbit(x);
}
return sum;
}
void add(int i,int x)
{
while(i<=n)
{
c[i] +=x;
i +=lowbit(i);
}
}
int main()
{
while(cin>>n&&n)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
cin>>node[i].val;
node[i].pos=i;
}
sort(node+1,node+1+n);
for(int i=1;i<=n;i++)
a[node[i].pos]=i;///离散化
ll ans=0;
for(int i=1;i<=n;i++)
{
ans +=i -1-get_sum(a[i]);//统计逆序数
add(a[i],1);
}
cout<<ans<<endl;
}
return 0;
}