• hdu1394 Minimum Inversion Number


    http://acm.hdu.edu.cn/showproblem.php?pid=1394 

    线段树,单点更新

    用线段树优化,求逆序数,O(N*logN)

     1 #include <stdio.h>
     2 
     3 #define lson l, m, root<<1
     4 #define rson m+1, r, root<<1|1
     5 
     6 const int maxn = 5010;
     7 int sum[maxn<<2];
     8 
     9 void push_up(int root)
    10 {
    11     sum[root] = sum[root<<1] + sum[root<<1|1];
    12 }
    13 
    14 void build(int l, int r, int root)
    15 {
    16     int m;
    17     if(l == r)
    18     {
    19         sum[root] = 0;
    20         return;
    21     }
    22     m = (l + r) >> 1;
    23     build(lson);
    24     build(rson);
    25     push_up(root);
    26 }
    27 
    28 void update(int x, int one, int l, int r, int root)
    29 {
    30     int m;
    31     if(l == r)
    32     {
    33         sum[root] = one;
    34         return;
    35     }
    36     m = (l + r) >> 1;
    37     if(x <= m)
    38     {
    39         update(x, one, lson);
    40     }
    41     if(m+1 <= x)
    42     {
    43         update(x, one, rson);
    44     }
    45     push_up(root);
    46 }
    47 
    48 int query(int L, int R, int l, int r, int root)
    49 {
    50     int m, result;
    51     if(L <= l && r <= R)
    52     {
    53         return sum[root];
    54     }
    55     result = 0;
    56     m = (l + r) >> 1;
    57     if(L <= m)
    58     {
    59         result += query(L, R, lson);
    60     }
    61     if(m+1 <= R)
    62     {
    63         result += query(L, R, rson);
    64     }
    65     return result;
    66 }
    67 
    68 int main()
    69 {
    70     int n, a[maxn], i, sum, result;
    71     while(~scanf("%d", &n))
    72     {
    73         build(1, n, 1);
    74         sum = 0;
    75         for(i=1; i<=n; i++)
    76         {
    77             scanf("%d", a+i);
    78             a[i] ++;
    79             sum += query(a[i], n, 1, n, 1);
    80             update(a[i], 1, 1, n, 1);
    81         }
    82         //printf("%d\n", sum);
    83         result = sum;
    84         for(i=1; i<=n-1; i++)
    85         {
    86             //printf("%d + %d == ", sum, n-1-(a[i]-1)*2);
    87             sum += (n-1-(a[i]-1)*2);
    88             //printf("%d\n", sum);
    89             if(sum < result)
    90             {
    91                 result = sum;
    92             }
    93         }
    94         printf("%d\n", result);
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    makefile之伪目标
    小马哥课堂-统计学-t分布(2)
    小马哥课堂-统计学-t分布
    小马哥课堂-统计学-无偏估计
    matplotlib 添加注释的方式
    leetcode 链表类型题目解题总结
    LeetCode矩阵题型
    fuzzing学习
    linux-2.6.18源码分析笔记---中断
    leetcode math类型题目解题总结
  • 原文地址:https://www.cnblogs.com/yuan1991/p/hdu1394.html
Copyright © 2020-2023  润新知