http://acm.hdu.edu.cn/showproblem.php?pid=3743
分析:就是求逆序数,要注意离散化处理,题目信息也不说行清楚
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NM=1000005;
int a[NM],c[NM];
struct Node{
int vau,pos;
}node[NM];
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
while(x<NM)
{
c[x]++;
x+=lowbit(x);
}
}
__int64 getsum(int x)
{
__int64 ans=0;
while(x>0)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
bool comp(struct Node A,struct Node B)
{
if(A.vau<B.vau) return 1;
else return 0;
}
int main()
{
int n,i;
__int64 res;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{
scanf("%d",&node[i].vau);
node[i].pos=i;
}
sort(node+1,node+1+n,comp);
for(i=1;i<=n;i++)
a[node[i].pos]=i;
res=0;
for(i=1;i<=n;i++)
{
add(a[i]);
res+=i-getsum(a[i]);
}
printf("%I64d\n",res);
}
return 0;
}