树状数组求逆序对数板子

来源:互联网 发布:空中杀手 知乎 编辑:程序博客网 时间:2024/05/16 18:53
#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cstring>#include<queue>#include<stack>#include<set>#include<map>#include<cmath>#include<iomanip>#define debug(x) cerr<<#x<<"="<<x<<endlusing namespace std;typedef pair<int,int> pii;typedef long long ll;const int INF = 0x7f7f7f7f;const ll llINF = 0x7fffffffff;inline int init(){    int now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }}inline long long llinit(){    long long now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }}struct node{int v,index;}p[510000];int lowbit(int x){return x&(-x);}int a[510000];int n;int b[500010];bool cmp(node a,node b){return a.v<b.v;}int getsum(int x){int tmp=x,tot=0;while(x){tot+=b[x];x-=lowbit(x);}return tot;}void build(int x){int tmp=x;for(;tmp+=lowbit(tmp);tmp<=n){b[tmp]+=p[x].v;}}void ins(int x,int v){for(int i=x;i<=n;i+=lowbit(i)){b[i]+=v;}}int main(){int ans=0;n=init();for(int i=1;i<=n;i++){p[i].index=i;p[i].v=init();}sort(p+1,p+1+n,cmp);for(int i=1;i<=n;i++){a[p[i].index]=i;}for(int i=1;i<=n;i++){ins(a[i],1);ans+=i-getsum(a[i]);}printf("%d\n",ans);return 0;}

0 0