POJ 2299 树状数组求逆序数+离散化

来源:互联网 发布:c4dr16注册机mac 编辑:程序博客网 时间:2024/05/16 10:09

400ms+,速度很快啊……


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{    int value;    int pos;}a[500005];int c[500005];int b[500005];int n;bool cmp(const node &a,const node &b){    return a.value<b.value;}int lowbit(int x){     return x&(-x);}int Sum(int end){    int sum=0;    while(end>0)    {         sum+=c[end];         end=end-lowbit(end);    }    return sum;}void change(int i,int x){     while(i<=n)     {          c[i]=c[i]+x;          i=i+lowbit(i);     }}int main(){    while(scanf("%d",&n)&&n)    {        long long ans=0;        for(int i=1;i<=n;i++)        {            c[i]=0;            scanf("%d",&a[i].value);            a[i].pos=i;        }        sort(a+1,a+n+1,cmp);        for(int i=1;i<=n;i++)        {            b[a[i].pos]=i;        }        for(int i=1;i<=n;i++)        {            change(b[i],1);            ans+=(i-Sum(b[i]));        }        printf("%lld\n",ans);    }    return 0;}


原创粉丝点击