HDU 1394 Minimum Inversion Number (数据结构-段树)

HDU 1394 Minimum Inversion Number (数据结构-段树)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Minimum Inversion Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9514    Accepted Submission(s): 5860


Problem Description
The inversion number of a given number sequence a1, a2, …, an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

For a given sequence of numbers a1, a2, …, an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

a1, a2, …, an-1, an (where m = 0 – the initial seqence)

a2, a3, …, an, a1 (where m = 1)

a3, a4, …, an, a1, a2 (where m = 2)



an, a1, a2, …, an-1 (where m = n-1)

You are asked to write a program to find the minimum inversion number out of the above sequences.

 


Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.

 


Output
For each case, output the minimum inversion number on a single line.

 


Sample Input
   
   
10 1 3 6 9 0 8 5 7 4 2

 


Sample Output
   
   
16

 


Author
CHEN, Gaoli
 


Source
 


Recommend
Ignatius.L
 

题目大意:

求逆序数。也就是给你一个序列,每次求逆序数,然再把第一个数放到这个序列的末尾,构成新的序列。问你这n个序列的最小的逆序数。

解题思路:

1、对于每一个序列。其原来的逆序数记为 pre , 假设当前把该序列 第一个数 a[0] 移动到尾部,那么新序列的逆序数为 pre-a[i]+(n-a[i]-1)

由于序列中比a[i]大的数有 n-a[i]-1 个。比a[i]小的有 a[i]个。

因此仅仅需求出第一个序列的逆序数,依次能够递推出这n个序列的逆序数,求出最小的就可以

2、求第一个序列的逆序数的方法

(1)暴力算法,据说不会超时

(2)线段树,建 [0,n]这段树。对于数据 a[i] ,先查询 (a[i]+1,n) 这段的值也就是比a[i]大的数的个数也就是 逆序数,然后插入 (a[i],a[i]) 值为1

代码:

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn=5100;

struct tree{
    int l,r,sum;
}a[maxn*4];

int data[maxn],n,m;

void build(int l,int r,int k){
    a[k].l=l;
    a[k].r=r;
    a[k].sum=0;
    if(l<r){
        int mid=(l+r)/2;
        build(l,mid,2*k);
        build(mid+1,r,2*k+1);
    }
}

void insert(int l,int r,int k,int c){
    if(l<=a[k].l && a[k].r<=r){
        a[k].sum+=c;
    }else{
        int mid=(a[k].l+a[k].r)/2;
        if(r<=mid) insert(l,r,2*k,c);
        else if(l>=mid+1) insert(l,r,2*k+1,c);
        else{
            insert(l,mid,2*k,c);
            insert(mid+1,r,2*k+1,c);
        }
        a[k].sum=a[2*k].sum+a[2*k+1].sum;
    }
}

int query(int l,int r,int k){
    if(l<=a[k].l  && a[k].r<=r){
        return a[k].sum;
    }else{
        int mid=(a[k].l+a[k].r)/2;
        if(r<=mid) return query(l,r,2*k);
        else if(l>=mid+1) return query(l,r,2*k+1);
        else{
            return query(l,mid,2*k) + query(mid+1,r,2*k+1) ;
        }
    }
}

void solve(){
    int ans=0;
    build(1,n,1);
    for(int i=1;i<=n;i++){
        ans+=query(data[i]+1,n,1);
        insert(data[i]+1,data[i]+1,1,1);
        //cout<<data[i]<<" "<<ans<<endl;
    }
    int tmp=ans;
    for(int i=1;i<=n;i++){
        tmp-=data[i];
        tmp+=n-data[i]-1;
        if(tmp<ans) ans=tmp;
    }
    cout<<ans<<endl;
}

int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++) scanf("%d",&data[i]);
        solve();
    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116730.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 递归函数

    java 递归函数一、递归函数,通俗的说就是函数本身自己调用自己…如:n!=n(n-1)!你定义函数f(n)=nf(n-1)而f(n-1)又是这个定义的函数。。这就是递归二、为什么要用递归:递归的目的是简化程序设计

    2022年7月2日
    22
  • 弹性网络回归模型_数据模型剪枝

    弹性网络回归模型_数据模型剪枝本文首发于PandaCV公众号。导语:模型剪枝算法核心在于找到“不重要”的参数并且实现裁剪。为寻找到较优的剪枝策略,我们往往需要尝试多种剪枝策略和剪枝策略性能评估。通常剪枝策略评估方法是将剪枝后的模型训练到收敛或者训练规定好数量epoch后进行性能比较。不管是人工调试剪枝策略还是自动搜索剪枝策略,都需要多次评估剪枝策略。剪枝策略的评估效率一定程度上影响了整体压缩效率。因此,本文提出了一种能够快速衡量剪枝后模型性能的方法,经实验能够对MobilenetV1减少50%的FLOPs情况下,仍能保证在Image

    2022年8月16日
    15
  • 《大白AI周报》精华内容整理汇总「建议收藏」

    《大白AI周报》精华内容整理汇总「建议收藏」在人工智能学习中,大家或多或少都会关注一些公众号,但随着每天信息量的暴增,碎片化的内容让大家应接不暇。如何挖掘有价值的内容,如何快速查阅自己需要的内容,是一个头疼的问题。因此大白每周都会将人工智能领域,几十个公众号每周发布的精华内容汇总起来。同时进行系统的分类,让大家对于人工智能行业每周的技术动态**可以一目了然,希望对大家有帮助。《大白AI周报》每周精华文章链接:每周日报的内容还是有点多,大白将其中的更加系统性,或者对项目来说,更有针对性的文章,整理到本文中,方便大家更好的查看。整理汇总:江大白

    2022年8月31日
    6
  • 如何建立爬虫代理ip池「建议收藏」

    如何建立爬虫代理ip池「建议收藏」目录一、为什么需要建立爬虫代理ip池二、如何建立一个爬虫代理ip池原文地址:https://www.cnblogs.com/TurboWay/p/8172246.html一、为什么需要建立爬虫代理ip池在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑、在一段时…

    2022年5月15日
    38
  • 怎么理解泊松分布_泊松分布公式

    怎么理解泊松分布_泊松分布公式1甜在心馒头店公司楼下有家馒头店:每天早上六点到十点营业,生意挺好,就是发愁一个事情,应该准备多少个馒头才能既不浪费又能充分供应?老板统计了一周每日卖出的馒头(为了方便计算和讲解,缩小了数据):均值为:按道理讲均值是不错的选择(参见如何理解最小二乘法?),但是如果每天准备5个馒头的话,从统计表来看,至少有两天不够卖,的时间不够卖:你“甜在心馒头店”又不是…

    2022年8月30日
    2
  • 【MyBatis学习13】MyBatis中的二级缓存[通俗易懂]

    【MyBatis学习13】MyBatis中的二级缓存[通俗易懂]1.二级缓存的原理  前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。为了更加清楚的描述二级缓存,先来看一个示意图:  从图中可以看出:sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到该UserMapper的二级缓存中。

    2022年9月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号