zoukankan      html  css  js  c++  java
  • hdu1394 Minimum Inversion Number

    有点思考难度 主要是用线段树求逆序对 利用线段树保存区间和的性质

    #include<stdio.h>
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define maxn 5555
    int n,x[maxn],sum[maxn],add=0;
    int Pushup(int rt)
    {
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    int build(int l,int r,int rt)
    {
        int m=0;
        if(l==r) {sum[rt]=0;return 0;}
        m=(l+r)>>1;
        build(lson);
        build(rson);
        Pushup(rt);
    }
    int query(int L,int R,int l,int r,int rt)
    {
        int m,temp=0;
        if(L<=l&&r<=R) return sum[rt];
        m=(l+r)>>1;
        if(L<=m) temp+=query(L,R,lson);
        if(m<R)  temp+=query(L,R,rson);
        return temp;
    }
    int updata(int q,int l,int r,int rt)
    {
        int m;
        if(l==r) {sum[rt]++;return 0;}
        m=(l+r)>>1;
        if(q<=m) updata(q,lson);
        else updata(q,rson);
        Pushup(rt);
    }
    int main()
    {
        freopen("hdu1394.in","r",stdin);
        freopen("hdu1394.out","w",stdout);
        int i,ans;
        while(scanf("%d",&n)==1)
        {   
            build(0,n-1,1);add=0;
            for(i=1;i<=n;i++)
                {
                    scanf("%d",&x[i]);
                    add=add+query(x[i]+1,n-1,0,n-1,1);
                    updata(x[i],0,n-1,1);
                }
            ans=add;
            for(i=1;i<=n;i++)
                {
                    add+=-x[i]+n-1-x[i];
                    ans=ans<add?ans:add;
                }
            printf("%d\n",ans);
        }
        return 0;
    }


  • 相关阅读:
    通用分页后台显示
    自定义的JSP标签
    Java反射机制
    Java虚拟机栈---本地方法栈
    XML建模实列
    XML解析与xml和Map集合的互转
    [离散数学]第二次作业
    [线性代数]2016.10.13作业
    [数字逻辑]第二次作业
    [线性代数]2016.9.26作业
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480501.html
Copyright © 2011-2022 走看看