HDU 1394 Minimum Inversion Number(树状数组+逆序数)

来源:互联网 发布:食品数据分析咨询公司 编辑:程序博客网 时间:2024/05/18 09:16

</pre></h1><p><span style="font-family:'Times New Roman'"><strong><span style="font-size:12px; font-family:Arial; color:green">                                             </span><span style="font-family:Arial; color:green"><span style="font-size:18px">                  Minimum Inversion Number</span></span></strong></span></p><p><span style="font-family:'Times New Roman'; font-size:14px"><strong><span style="font-family:Arial; font-size:12px; color:green">Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)</span></strong></span></p><span style="font-family:'Times New Roman'; font-size:14px"><strong><span style="font-family:Arial; font-size:12px; color:green">Total Submission(s): 18380    Accepted Submission(s): 11159</span></strong></span><br style="font-family:'Times New Roman'; font-size:14px" /><br style="font-family:'Times New Roman'; font-size:14px" /><div class="panel_title" align="left" style="height:38px; padding:0px 14px; color:rgb(124,169,237); font-size:18px; font-family:Arial; font-weight:bold">Problem Description</div><div class="panel_content" style="height:auto; margin:0px; padding:0px 20px; font-size:14px; font-family:'Times New Roman'">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.</div><div class="panel_bottom" style="height:auto; margin:0px; font-family:'Times New Roman'; font-size:14px"> </div><br style="font-family:'Times New Roman'; font-size:14px" /><div class="panel_title" align="left" style="height:38px; padding:0px 14px; color:rgb(124,169,237); font-size:18px; font-family:Arial; font-weight:bold">Input</div><div class="panel_content" style="height:auto; margin:0px; padding:0px 20px; font-size:14px; font-family:'Times New Roman'">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.</div><div class="panel_bottom" style="height:auto; margin:0px; font-family:'Times New Roman'; font-size:14px"> </div><br style="font-family:'Times New Roman'; font-size:14px" /><div class="panel_title" align="left" style="height:38px; padding:0px 14px; color:rgb(124,169,237); font-size:18px; font-family:Arial; font-weight:bold">Output</div><div class="panel_content" style="height:auto; margin:0px; padding:0px 20px; font-size:14px; font-family:'Times New Roman'">For each case, output the minimum inversion number on a single line.</div><div class="panel_bottom" style="height:auto; margin:0px; font-family:'Times New Roman'; font-size:14px"> </div><br style="font-family:'Times New Roman'; font-size:14px" /><div class="panel_title" align="left" style="height:38px; padding:0px 14px; color:rgb(124,169,237); font-size:18px; font-family:Arial; font-weight:bold">Sample Input</div><div class="panel_content" style="height:auto; margin:0px; padding:0px 20px; font-size:14px; font-family:'Times New Roman'"><pre style="word-wrap:break-word; white-space:pre-wrap; margin-top:0px; margin-bottom:0px"><div style="font-family:'Courier New',Courier,monospace">101 3 6 9 0 8 5 7 4 2</div>
 

Sample Output
16
 

Author
CHEN, Gaoli
 

Source
ZOJ Monthly, January 2003


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5005;
int a[N], bit[N];
int lowbit(int k)
{
    return k&-k;
}
void add(int x)
{
    while(x<N)
    {
        bit[x]+=1;
        x+=lowbit(x);
    }
    return ;
}
int sum(int x)
{
    int ans=0;
    while(x)
    {
        ans+=bit[x];
        x-=lowbit(x);
    }
    return ans;
}


int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        memset(bit,0,sizeof(bit));
        int tmp=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d", &a[i]);
            a[i]++;
            add(a[i]);
            tmp+=(i-sum(a[i]));
        }
        int ans=tmp;
        for(int i=1;i<=n;i++)
        {
            tmp=tmp+(n-a[i])-(a[i]-1);
            ans=min(ans,tmp);
        }
        printf("%d\n",ans);
    }
    return 0;
}

0 0
原创粉丝点击