求一串序列相邻连个元素交换多少后,是一串上升的序列。
思路:求该串序列的逆序数,数据比较大,要离散化。
AC代码:
#include<stdio.h>
#include<string.h>
#include<set>
#include<map>
#include<algorithm>
#define ll __int64
using namespace std;
const ll maxn=500010;
ll n,c[maxn],a[maxn];
struct node
{
ll val,id;
};
struct node p[maxn];
ll lowbit(ll x)
{
return x&(-x);
}
void update(ll x,ll i)
{
while(x<=n)
{
c[x]+=i;
x+=lowbit(x);
}
}
ll sum(ll x)
{
ll ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
bool cmp(node a,node b)
{
return a.val<b.val;
}
int main()
{
ll i;
while(scanf("%I64d",&n)!=EOF,n)
{
memset(a,0,sizeof a);
memset(c,0,sizeof c);
for(i=1;i<=n;i++)
{
scanf("%I64d",&p[i].val);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++)//离散化
a[p[i].id]=i;
ll temp,ans=0;
for(i=1;i<=n;i++)
{
update(a[i],1);
temp=sum(a[i]);
ans+=i-temp;
}
printf("%I64d\n",ans);
}
return 0;
}