Minimum Inversion Number

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

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

ZOJ Monthly, January 2003

Recommend

Ignatius.L | We have carefully selected several similar problems for you: 1166 1698 1540 1542 1255

看到题的第一眼还以为是动态逆序对,读完题后发现竟然是一道水题。

这道题想让我们求的是在不断改变元素的顺序之后所有逆序对的最小值。怎么做?首先我们知道在进行n" role="presentation" style="position: relative;">nn次轮换之后数列又变回去了,所以我们只需用一种高效的方法统计出每次轮换后数列逆序对的个数就行了。

怎么统计?

显然第一次逆序对直接上树状数组(线段树)求so" role="presentation" style="position: relative;">soso easy" role="presentation" style="position: relative;">easyeasy,那么之后的轮换呢?用n" role="presentation" style="position: relative;">nn次树状数组==gg" role="presentation" style="position: relative;">gggg,因此可以想到这样轮换有特殊的性质。没错就是这样。我们考虑当前队首的元素,这个元素从队首移到队尾的操作可以拆成队首弹出,队尾插入的操作,设上一次的逆序对数为sum" role="presentation" style="position: relative;">sumsum,那么这个元素从队首弹出显然会使sum" role="presentation" style="position: relative;">sumsum减少a1−1" role="presentation" style="position: relative;">a1−1a1−1,道理显然(a1" role="presentation" style="position: relative;">a1a1之后有a1−1" role="presentation" style="position: relative;">a1−1a1−1个数比它小),同理,这个元素从队尾插入会使sum" role="presentation" style="position: relative;">sumsum变大n−a1" role="presentation" style="position: relative;">n−a1n−a1(证明同理)。这样看来的话似乎一个循环比比大小就没了啊。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 5005
using namespace std;
int n,bit[N],a[N],sum,ans;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
inline int lowbit(int x){return x&-x;}
inline void update(int x,int v){for(int i=x;i<=n;i+=lowbit(i))bit[i]+=v;}
inline int query(int x){int ans=0;for(int i=x;i;i-=lowbit(i))ans+=bit[i];return ans;}
int main(){
    while(~scanf("%d",&n)){
        sum=ans=0;
        memset(a,0,sizeof(a));
        memset(bit,0,sizeof(bit));
        for(int i=1;i<=n;++i){
            a[i]=read()+1;
            sum+=query(n)-query(a[i]);
            update(a[i],1);
        }
        ans=sum;
        for(int i=1;i<=n;++i)ans=min(ans,sum=sum-a[i]+1+n-a[i]);
        printf("%d\n",ans);
    }
    return 0;
}

2018.07.08 hdu1394 Minimum Inversion Number(线段树)的更多相关文章

  1. hdu1394(Minimum Inversion Number)线段树

    明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊. 还是先贴题吧 HDU-1394 Minimum Inversion Number Time ...

  2. HDU-1394 Minimum Inversion Number 线段树+逆序对

    仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...

  3. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  4. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  5. HDU 1394 Minimum Inversion Number(线段树 或 树状数组)

    题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...

  6. 2018.07.08 hdu6183 Color it(线段树)

    Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Proble ...

  7. hdu - 1394 Minimum Inversion Number(线段树水题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...

  8. hdu 13394 Minimum Inversion Number 线段树

    题意: 首先给你一个长度为n的序列v,你需要首先找出来逆序对(i<j && v[i]>v[j]) 然后把这个序列的最后一个元素放在第一个位置上,其他元素都向后移动一位. 一 ...

  9. 2018.07.08 POJ 2481 Cows(线段树)

    Cows Time Limit: 3000MS Memory Limit: 65536K Description Farmer John's cows have discovered that the ...

随机推荐

  1. maven项目--Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener

    转自:https://yq.aliyun.com/ziliao/597445 Eclipse中tomcat部署工程启动后报错: 二月 25, 2016 2:34:00 下午 org.apache.to ...

  2. 21OGNL与ValueStack(VS)-静态方法访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在LoginAction中增加如下方法: public static Str ...

  3. 面向过程中的局部变量(global)

    1.school = 'oldboy.edu' def change_name(name): school = " Mage Linux"                  # 局 ...

  4. vue深入了解组件——处理边界情况

    一.访问元素&组件 在绝大多数情况下,我们最好不要触达另一个组件实例内部或手动操作DOM元素.不过也确实在一些情况下做这些事情是合适的. 1.1 访问根实例 在每个 new Vue 实例的子组 ...

  5. Linux_free(buffer与cache区别)

    一.free命令[root@xen_202_12 /]# free -m             total       used       free     shared    buffers   ...

  6. Vue.js路由详解

    有时候,我们在用vue的时候会有这样的需求,比如一个管理系统,点了左边的菜单栏,右边跳转到一个新的页面中,而且刷新的时候还会停留在原来打开的页面. 又或者,一个页面中几个不同的画面来回点击切换,这两种 ...

  7. 不用登陆密码也能进路由器,适用于TP、磊科、腾达

    结合wooyun提供的腾达COOKIE漏洞,结合自己的经验,成功进入腾达路由器破解其登陆密码和无线密码. 教程开始: 所用工具:WebCruiser 输入路由网关,出现登陆界面. 选择:COOKIE  ...

  8. R画散点图、线型图、箱型图、直方图基本知识

    1.导入数据 2.散点图 plot(iris[,1]~iris[,4],xlab='Length',ylab='Width',col='red',main='Length VS Width')

  9. samtools软件的使用

    1)samtools简介--------------------------------------------------------------------------背景:前面我们讲过sam/b ...

  10. input disable手机端颜色兼容问题

    color: #5b636d; -webkit-text-fill-color: #5b636d; opacity: 1; -webkit-opacity: 1; input在移动端会有padding ...