hdu(4911)树状数组求逆序队

来源:互联网 发布:金粉世家知乎 编辑:程序博客网 时间:2024/06/06 08:23


就是每一次都把这个数所在的节点赋予1,那么如果此时他前面存在了1,那么说明前面的比他先出现,然而他又比前面的大,那么就说明了这是正序对,然后就把他加上前面的1数就好了,再用当前的数减去前面的正序対的个数就是逆序对

这道题必须要用

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxx 500050int bit[maxx],a[maxx];int n;struct node {int x,y;}pos[maxx];bool cmp(node aa,node bb){    return aa.x<bb.x;}int sum(int i){    int s=0;    while(i>0){        s+=bit[i];        i=i&(i-1);    }    return s;}void add(int i,int xx){    while(i<=n)    {        bit[i]+=xx;        i+=i&-i;    }}int k;void slove(){   long long  int  ans=0;    for(int j=0;j<n;j++){        ans+=j-sum(a[j]);        add(a[j],1);    }    if(ans<k) ans=k;    printf("%I64d\n",ans-k);}int main() {   while(scanf("%d%d",&n,&k)==2){    memset(bit,0,sizeof(bit));    for(int i=0;i<n;i++){    scanf("%d",&pos[i].x);    pos[i].y=i;    }    stable_sort(pos,pos+n,cmp);    for(int i=0;i<n;i++)    a[pos[i].y]=i+1;    slove();   }}


0 0
原创粉丝点击