zoukankan      html  css  js  c++  java
  • [HDU1394]Minimum Inversion Number

    题目:Minimum Inversion Number

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

    分析:

    1)先对序列求逆序对的数目,归并排序,线段树,树状数组都可以。

    2)考虑到这是一个[0,n)的排列,全体加一,变成一个[1,n]的排列。

    3)把第一个数移动到最后一位对答案的贡献是(n-a[1])-(a[1]-1)。在第二位到最后一位比a[1]大的有(n-a[1]),这些将由顺序变逆序,比a[1]小的有(a[1]-1),这些将由逆序变顺序。

    4)这是一个环,i从头枚举,第i位成为首位,移动到末尾时,对答案的贡献是(n-a[i])-(a[i]-1)。

    5)取个最小值即可。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxN=50005;
    int n,a[maxN],T[maxN];
    void Tadd(int x,int y){for(int i=x;i<=n;i+=i&-i)T[i]+=y;}
    int Tque(int x){int ret=0;for(int i=x;i;i-=i&-i)ret+=T[i];return ret;}
    int main(){
        for(int ans,tans;~scanf("%d",&n);){
            tans=0;
            for(int i=1;i<=n;++i)T[i]=0;
            for(int i=1;i<=n;++i){scanf("%d",&a[i]);++a[i];}
            for(int i=n;i>=1;--i){tans+=Tque(a[i]);Tadd(a[i],1);}
            ans=tans;
            for(int i=1;i<=n;++i){tans+=n-a[i]-a[i]+1;ans=min(ans,tans);}
            printf("%d
    ",ans);
        }
        return 0;
    } 
  • 相关阅读:
    安装jupyter_contrib_nbextensions库
    1.20
    架构之美阅读笔记01
    使用 netcat 数据源测试 Flume
    使用 Avro 数据源测试 Flume
    Tensorflow01-认识张量Tensor
    Spark06-RDD分区、缓存与Checkpoint讲解
    Spark05-RDD算子细谈
    Spark04-RDD入门
    Spark03-Scala面向对象和函数式编程
  • 原文地址:https://www.cnblogs.com/hjj1871984569/p/10347201.html
Copyright © 2011-2022 走看看