zoukankan      html  css  js  c++  java
  • HDU4911 Inversion 解题报告

    题意:求逆序对

    解题思路:1)树状数组 + 离散化

    解题代码:

     1 // File Name: a.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年08月05日 星期二 12时05分09秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 
    26 using namespace std;
    27 int n , k ; 
    28 LL sum = 0 ; 
    29 int lowbit(int x)
    30 {
    31     return x&(-x);
    32 }
    33 struct node{
    34     int num, s,rs ; 
    35 }a[100005];
    36 int num[100005];
    37 int getsum(int x){
    38     int sum = 0 ;
    39     while(x >= 1)
    40     {
    41         sum += num[x];
    42         x -= lowbit(x);
    43     }
    44     return sum ; 
    45 }
    46 void update(int x)
    47 {
    48     while(x <= n )
    49     {
    50         num[x] ++ ; 
    51         x += lowbit(x);
    52     }
    53     return; 
    54 }
    55 int cmp(node x ,node y )
    56 {
    57     return x.num < y.num;
    58 }
    59 int cmp1(node x, node y)
    60 {
    61     return x.s < y.s; 
    62 }
    63 int main(){
    64     while(scanf("%d %d",&n,&k)!= EOF)
    65     {
    66         memset(num,0,sizeof(num));
    67         for(int i =1;i <= n;i ++)
    68         {
    69             scanf("%d",&a[i].num);
    70             a[i].s = i  ;
    71         }
    72         sort(a+1,a+1+n,cmp);
    73         int t = 1; 
    74         a[1].rs = 1; 
    75         for(int i = 2;i <= n;i ++)
    76         {
    77             if(a[i].num == a[i-1].num) 
    78                 a[i].rs = t ;
    79             else {
    80                 t++;
    81                 a[i].rs = t; 
    82             }
    83         }
    84         sort(a+1,a+1+n,cmp1);
    85         sum = 0 ;
    86         for(int i = 1;i <= n;i ++)
    87         {
    88             sum += (getsum(n)- getsum(a[i].rs));
    89             update(a[i].rs);
    90         }
    91         if(sum > k)
    92           cout << sum-k << endl;
    93         else printf("0
    ");
    94     }
    95     return 0;
    96 }
    View Code

    2)归并排序

    没有梦想,何谈远方
  • 相关阅读:
    外部晶振的使用原因与内部RC振荡器的使用方法
    Linux系统下ifconfig命令使用及结果分析
    浅谈程序的内存布局
    物理内存与虚拟内存之间的映射
    如何正确理解套接字
    研究自动驾驶技术的算法需要哪些知识?
    如何防止头文件被重复包含或引用?
    虚拟机-VMware小结-汇总
    局域网内快速传输数据
    thingsboard安装
  • 原文地址:https://www.cnblogs.com/zyue/p/3906424.html
Copyright © 2011-2022 走看看