您的位置:首页 > 其它

poj2299离散化,树状数组

2016-08-27 17:31 274 查看
求序列正序对的个数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=500005;

long long a[maxn],data[maxn];
int c[maxn];
int n;
void lisan()//离散化
{
memset(data,0,sizeof(data));
for(int i=0;i<n;i++)
data[i]=a[i];
sort(data,data+n);
int cc=unique(data,data+n)-data;
for(int i=0;i<n;i++)
a[i]=1+lower_bound(data,data+cc,a[i])-data;
}
int lowbit(int x)
{
return x&-x;
}
void update(int x,int add)
{
while(x<=maxn)
{
c[x]+=add;
x+=lowbit(x);
}
}
long long sum(int x)
{
long long ret=0;
while(x)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}

int main()
{
while(~scanf("%d",&n)&&n)
{
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
lisan();
//        for(int i=0;i<n;i++)
//        cout<<a[i]<<endl;
long long ans=0;
for(int i=0;i<n;i++)
{
update(a[i],1);
ans+=(i+1-sum(a[i]));
//cout<<i-sum(a[i]-1)-1<<endl;
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: