//求解逆序数对:(后面的数比当前的数小的个数)
//例:9 1 0 5 4
//9的逆序数:91 90 95 94 共有4个
//1的逆序数: 10 共有1个
//0的逆序数: 为0个
//5的逆序数:54为1个
//4的逆序数:0个
//所以9 1 0 5 4的逆序数共有6个
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
using namespace std;
struct node
{
int x;
int pox;
}Node[501000];
int num[501000];
int cmp(node a,node b)
{
return a.x>b.x;
}
int lowbit(int x)
{
return -x&x;
}
void upData(int n,int T)
{
while(n<T)
{
num[n]+=1;
n+=lowbit(n);
}
}
int getSum(int n)
{
int ans=0;
while(n>0)
{
ans+=num[n];
n-=lowbit(n);
}
return ans;
}
int main()
{
int T;
__int64 ans;
while(scanf("%d",&T),T)
{
ans=0;
memset(Node,0,sizeof(Node));
memset(num,0,sizeof(num));
for(int i=0;i<T;i++)
{
scanf("%d",&Node[i].x);
Node[i].pox=i+1;
}
sort(Node,Node+T,cmp);
for(int i=0;i<T;i++)
{
ans+=getSum(Node[i].pox-1);
upData(Node[i].pox,T);
}
printf("%I64d\n",ans);
}
return 0;
}
http://poj.org/problem?id=2299 树状数组 《复习》
最新推荐文章于 2021-04-20 10:56:04 发布