//采用树状数组求逆序对 离散化
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=5e5+10;
struct node
{
int p,v;
}q[N];
int hx[N],tr[N*2],n;
int cmp(const node&a,const node&b)
{
return a.v<b.v;
}
int lowbit(int i)
{
return i&(-i);
}
void build(int i)
{//建立树状数组
while(i<=n){
tr[i]+=1;
i+=lowbit(i);
}
}
ll getsum(int i)
{//比i小的数的个数
int ret=0;
while(i){
ret+=tr[i];
i-=lowbit(i);
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
ll ans=0;
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&q[i].v);
q[i].p=i;
}
sort(q+1,q+n+1,cmp);
for(i=1;i<=n;i++)hx[q[i].p]=i;//离散化
memset(tr,0,sizeof(tr));
for(i=1;i<=n;i++)
{//此处写成tr[i]
build(hx[i]);
ans+=i-getsum(hx[i]);
}
printf("%lld\n",ans);
}
return 0;
}
【模板】树状数组求逆序对
最新推荐文章于 2024-09-17 13:27:22 发布