HDU 1394 Minimum Inversion Number(暴力/线段树)

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

暴力(Time:453ms)

#include<stdio.h>
#define MAXN 5005
int a[MAXN];
int main()
{
    int n,i,j;
    while(~scanf("%d",&n))
    {
        int ans=0x3f3f3f3f;
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        int sum=0;
        for(i=0; i<n; i++)
            for(j=i+1; j<n; j++)
                if(a[i]>a[j])
                    sum++;
        if(ans>sum)
            ans=sum;
        for(i=0; i<n; i++)
        {
            sum=sum-a[i]+n-1-a[i];
            if(ans>sum)
                ans=sum;
        }
        printf("%d\n",ans);
    }
    return 0;
}

线段树(Times:93ms)

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define lson l, m , rt << 1
#define rson m+1, r, rt << 1 | 1
#define root 0,n-1,1
const int MX=5000+5;
int S[MX<<2];
void push_up(int rt)
{
    S[rt]=S[rt<<1]+S[rt<<1|1];
}
void build(int l,int r,int rt)
{
    S[rt]=0;
    if(l==r)
        return ;
    int m=(l+r)>>1;
    build(lson);
    build(rson);
}
void update(int x,int l,int r,int rt)
{
    if(l==r)
    {
        S[rt]=1;
        return ;
    }
    int m=(l+r)>>1;
    if(x<=m)
        update(x,lson);
    else
        update(x,rson);
    push_up(rt);
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
        return S[rt];
    int m=(l+r)>>1,ret=0;
    if(L<=m)
        ret+=query(L,R,lson);
    if(R>m)
        ret+=query(L,R,rson);
    return ret;
}
int main()
{
    int n,x[MX];
    while(~scanf("%d",&n))
    {
        build(root);
        int sum=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&x[i]);
            sum+=query(x[i],n-1,root);
            update(x[i],root);
        }
        int cnt=sum;
        for(int i=0; i<n; i++)
        {
            sum=sum-x[i]+n-1-x[i];
            if(sum<cnt)
                cnt=sum;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 07:01:54

HDU 1394 Minimum Inversion Number(暴力/线段树)的相关文章

hdu 1394 Minimum Inversion Number(线段树)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10853    Accepted Submission(s): 6676 Problem Description The inversion number of a given number sequence a1, a2, ..., a

HDU 1394 Minimum Inversion Number(线段树求逆序数)

题目地址:HDU 1394 这题可以用线段树来求逆序数. 这题的维护信息为每个数是否已经出现.每次输入后,都从该点的值到n-1进行查询,每次发现出现了一个数,由于是从该数的后面开始找的,这个数肯定是比该数大的.那就是一对逆序数,然后逆序数+1.最后求完所有的逆序数之后,剩下的就可以递推出来了.因为假如目前的第一个数是x,那当把他放到最后面的时候,少的逆序数是本来后面比他小的数的个数.多的逆序数就是放到后面后前面比他大的数的个数.因为所有数都是从0到n-1.所以比他小的数就是x,比他大的数就是n-

HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由[1,N]构成,可以通过旋转把第一个移动到最后一个. 问旋转后最小的逆序数对. 分析: 注意,序列是由[1,N]构成的,我们模拟下旋转,总的逆序数对会有规律的变化. 求出初始的逆序数对再循环一遍就行了. 至于求逆序数对,我以前用归并排序解过这道题:点这里. 不过由于数据范围是5000,所以完全可以用线

HDU 1394 Minimum Inversion Number(线段树求逆序对)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1394 解题报告:给出一个序列,求出这个序列的逆序数,然后依次将第一个数移动到最后一位,求在这个过程中,逆序数最小的序列的逆序数是多少? 这题有一个好处是输入的序列保证是0 到 n-1,所以不许要离散化,还有一个好处就是在计算在这个序列中比每个数大和小的数一共有多少个的时候可以在O(1)时间计算出来,一开始我没有意识到,还傻傻的用了两层for循环来每次都计算,当然这样果断TLE了.把一个数从第一个移

HDU - 1394 Minimum Inversion Number (线段树求逆序数)

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 seq

HDU 1394 Minimum Inversion Number(线段树:单点更新,求逆序数)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14648    Accepted Submission(s): 8942 Problem Description The inversion n

HDU 1394 Minimum Inversion Number(线段树求逆序数啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 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,

HDU 1394——Minimum Inversion Number——————【线段树单点增减、区间求和】

Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1394 Appoint description:  System Crawler  (2015-03-30) Description The inversion number of a given number sequence a1, a

HDU - 1394 - Minimum Inversion Number (线段树 - 单点更新,区间求和)

题目传送:Minimum Inversion Number 思路:线段树,求最小逆序数,先可以通过n*logn的时间用线段树求出初始的逆序对数,然后递推求出其他的解,递推过程看代码 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include &