zoukankan      html  css  js  c++  java
  • hdu 1394 Minimum Inversion Number(树状数组)

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

    题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最多逆序对的个数

    求出原始序列的逆序对的数目,然后进行n-1次将第一个元素放到最后一个的操作,每次操作后可以用O(1)复杂度求得新序列的逆序对数目

    此题的关键点在于求出原始序列逆序对的数目,可以使用树状数组, 线段树, 归并等方法。

    下面是树状数组的解法

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define maxn 5010
    using namespace std;
    
    int c[maxn], arr[maxn], n;
    
    int lowbit(int x);
    
    void add(int x, int u);
    
    int sum(int x);
    
    int main(void)
    {
        while (scanf("%d", &n) != EOF)
        {
            int ans = 0;
            memset( c, 0, sizeof(c));
            for (int i = 0; i < n; ++i)
            {
                scanf("%d", arr + i);
                arr[i] += 1;
                ans += i - sum( arr[i]);
                add( arr[i], 1);
            }
            int pre = ans, tmp;
            for (int i = 0; i < n - 1; ++i)
            {
                tmp = pre - (arr[i] - 1) + (n - arr[i]);
                ans = min( ans, tmp);
                pre = tmp;
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    int sum(int x)
    {
        int result = 0;
        while (x > 0)
        {
            result += c[x];
            x -= lowbit(x);
        }
        return result;
    }
    
    void add(int x, int u)
    {
        while (x <= n)
        {
            c[x] += u;
            x += lowbit(x);
        }
    }
  • 相关阅读:
    echarts柱状图实现多条不同颜色渐变
    vue echarts 点击左侧菜单,宽度无法自适应,且支持 窗口大小改变echarts图自适应
    element 单列查询
    js实现双向数据绑定,vue v-model原理
    css3 nth-child使用
    基于工程实践选题的对同类软件产品的调研分析
    深度优先搜索
    迷宫
    元组和字典
    列表
  • 原文地址:https://www.cnblogs.com/chuninsane/p/4929433.html
Copyright © 2011-2022 走看看