//树状数组+离散化
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 500000+10;
int bit[maxn],c[maxn];
int n;
struct p{
int num;
int id;
}a[maxn],b[maxn];
int cmp1(const p& a, const p& b){
return a.num<b.num;
}
int cmp2(const p& a, const p& b){
return a.id<b.id;
}
void add(int i, int x){
while(i<=n){
bit[i]+=x;
i += i&(-i);
}
}
ll sum(int i){
ll res = 0;
while(i>0){
res += bit[i];
i -= i&(-i);
}
return res;
}
int main()
{
while(~scanf("%d",&n)&&n){
memset(bit,0,sizeof(bit));
for(int i=1;i<=n;++i){
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+n+1,cmp1);
c[a[1].id] = 1;
for(int i = 2; i <= n; i++)
{
if(a[i].num != a[i-1].num)
c[a[i].id] = i;
else c[a[i].id] = c[a[i-1].id];
}
int k=2;
b[1].num=1;
b[1].id=a[1].id; //不能少了这一条
for(int i=2;i<=n;++i){
if(a[i].num!=a[i-1].num){
b[i].num=i;
b[i].id=a[i].id;
}
else {
b[i].num=b[i-1].num;
b[i].id=a[i].id;
}
}
sort(b+1,b+n+1,cmp2);
ll ans = 0;
for(int i=1;i<=n;++i){
add(b[i].num,1);
ans += sum(n) - sum(b[i].num);
}
printf("%lld\n",ans);
}
return 0;
}
POJ 2299 Ultra-QuickSort
最新推荐文章于 2024-07-22 19:36:52 发布