POJ2299逆序对模板(树状数组)

题目:http://poj.org/problem?id=2299

只能相邻两个交换,所以交换一次只会减少一个逆序对。所以交换次数就是逆序对数。

ps:原来树状数组还可以记录后边lowbit位的部分和。见代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500005
using namespace std;
int n,f[maxn];
long long tmp[maxn],a[maxn],sum;
void add(int k)
{
while(k)
{
f[k]++;
k-=k&-k;
}
}
int query(int k)
{
int ret=;
while(k<=n)
{
ret+=f[k];
k+=k&-k;
}
return ret;
}
int main()
{
while()
{
sum=;
memset(f,,sizeof f);
scanf("%d",&n);
if(!n)return ;
for(int i=;i<=n;i++)
scanf("%lld",&a[i]),tmp[i]=a[i];
sort(tmp+,tmp+n+);
unique(tmp+,tmp+n+);
for(int i=;i<=n;i++)
a[i]=lower_bound(tmp+,tmp+n+,a[i])-tmp;
for(int i=;i<=n;i++)
{
sum+=query(a[i]);
add(a[i]);
}
printf("%lld\n",sum);
}
}
上一篇:NSPredicate过滤数组数据


下一篇:学派Delphi方法(推荐)——————————【Badboy】