题目描述
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.
输入格式
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.
输出格式
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.
样例数据
样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0
题目分析
求逆序对。
一个一个插入,统计比他大的。
我为了方便,倒序插入统计小的。
a[]太大,需要离散化。
注意开long long
源代码
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
const int maxn=500005;
struct BIT { //树状数组
long long n,c[maxn];
inline int Lowbit(int x) { //低位操作
return x&(-x);
}
void init(int n) {
this->n=n;
memset(c,0,sizeof(c));
}
void add(int x,int v) {
for(int i=x; i<=n; i+=Lowbit(i))c[i]+=v;
}
long long sum(int x) { //求出1~s的区间和
long long s=0;
for(int i=x; i; i-=Lowbit(i))s+=c[i];
return s;
}
} bit;
map<long long,long long>M;
map<long long,long long>::iterator it;
long long n,a[500005],b[500005];
void Discretization() { //a是待离散数组 b是离散后数组
M.clear();
memset(b,0,sizeof(b));
for(int i=1; i<=n; i++)M[a[i]]=1;
int i=1;
for(it=M.begin(); it!=M.end(); it++,i++)it->second=i;
for(int i=1; i<=n; i++)b[i]=M[a[i]];
}
long long ans=0;
int main() {
while(true) {
n=Get_Int();
if(n==0)break;
ans=0;
bit.init(n);
for(int i=1; i<=n; i++)a[i]=Get_Int();
Discretization();
for(int i=n; i>=1; i--) {
bit.add(b[i],1);
ans+=bit.sum(b[i]-1);
}
printf("%lld\n",ans);
}
return 0;
}