您的位置:首页 > 产品设计 > UI/UE

POJ 2299 Ultra-QuickSort

2015-12-06 21:14 369 查看
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

Source
Waterloo local 2005.02.05

离散化一下。
树状数组记录每个数前面包括本身小于等于这个数的个数,然后用i-个数即为答案。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=5*1e5+1000;
typedef long long ll;
int c[maxn];
int d[maxn];
int n;
struct node
{
int val;
int id;
} f[maxn];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int v)
{
for(int i=x; i<=n; i+=lowbit(i))
c[i]+=v;
}
int getsum(int x)
{
int s=0;
while(x>0)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
while(cin>>n &&n!=0)
{
int i;
for(i=1; i<=n; i++)
{
scanf("%d",&f[i].val);
f[i].id=i;
}
sort(f+1,f+1+n,cmp);
memset(c,0,sizeof(c));
for(i=1; i<=n; i++)
d[f[i].id]=i;
ll ans=0;
for(i=1; i<=n; i++)
{
add(d[i],1);
ans+=i-getsum(d[i]);
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM算法