poj 2299(树状数组)

题意:求QuickSort最坏情况下的交换次数。理解以后知道应该是一个求序列的逆序对问题。
#include<iostream>
#include
<cstdio>
#include
<cstring>
using namespace std;
#define max 1000001
long long tree[max];
long long x[max];
long long getsum(long long idx)
{
long long sum=0;
while(idx>0)
{
sum
+=tree[idx];
idx
-=(idx&-idx);
}
return sum;
}
void add(long long idx)
{
while(idx<=max)
{
tree[idx]
+=1;
idx
+=(idx&-idx);
}
}
int main()
{
long long n,i;
while(scanf("%lld",&n)!=EOF)
{
memset(tree,
0,sizeof(tree));
if(n==0) return 0;
long long a=0;
for(i=1;i<=n;i++)
{
scanf(
"%lld",&x[i]);
x[i]
++;
}
for(i=n;i;i--)
{
a
+=getsum(x[i]);
add(x[i]);
}
printf(
"%lld\n",a);
}
}

posted on 2011-06-05 16:49  thinking001  阅读(138)  评论(0)    收藏  举报

导航