一开始按照常规算法做,发现不行,因为可能导致树状数组空间开的太大999999999了都。参考了一下网上的答案,用到了所谓的离散化,我咋感觉和hash差不多。
这个博文把这个问题讲的特别详细了:http://wenku.baidu.com/link?url=AeZsivoojqQq74cwFq_58D6rL7cXXT0joHFMmYvWgY_U6VuNxyyzgyKYTl7maHcnPrbXhcQqL8_QI08G5Me-6D-kiXg2rm_K-4ObtD-Twom
下面自然而然贴出ac代码:
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int M=500002;
int cnt[M];
int dic[M];
class A
{
public:
int val,id;
};
A per[M];
bool cmp(A a, A b)
{
return a.val<b.val;
}
int lowbit(int x)
{
return x&(-x);
}
long long sum(int x)
{
long long s=0;
while(x>0)
{
s+=cnt[x];
x-=lowbit(x);
}
return s;
}
void add(int x,int val)
{
while(x<=M)
{
cnt[x]+=val;
x+=lowbit(x);
}
}
int main()
{
int n;
long long result;
while(cin>>n,n)
{
int x,y;
memset(cnt,0,sizeof(cnt));
memset(dic,0,sizeof(dic));
result=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&per[i].val);
per[i].id=i;
}
sort(per+1,per+n+1,cmp);
for(int m=1; m<=n; m++)
dic[per[m].id]=m;
for(int k=1; k<=n; k++)
{
add(dic[k],1);
result+=k-sum(dic[k]);
}
printf("%lld\n",result);
}
return 0;
}