zoukankan      html  css  js  c++  java
  • hdu1908 逆序对

    题目链接:https://www.luogu.com.cn/problem/P1908

    这个题不要以为拿到手就可以树状数组秒,本题的数据范围是1e9显然简单的树状数组是空间不够的,点个数有5e5,所以离散化之后用树状数组还是可以的,但是有没有更简明的方法呢?这就说到一种高效的排序方式mergesort了,这是一种分治算法,先排左边部分的数组,再改变后边部分的数组,最后将左右的数组合起来就可以获得排序后的数组,时间复杂度是O(nlogn),克难攻坚复杂度是O(n),所以非常高效,在排序的过程中,左边和右边部分已经排序好,这个时候就会检索两半边的元素,当左边取出的元素a[i]比右边取出的元素b[j]大时,因为左边的数组是有序的,所以我们很容易知道此时有[i,mid]区间内的数都是比b[j]大的,也就是mid-i+1个数,这样递归下去就可以求得逆序对的数量。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define pi 3.14159265
    11 #define lson l,mid,rt<<1
    12 #define rson mid+1,r,rt<<1|1
    13 #define scand(x) scanf("%llf",&x) 
    14 #define f(i,a,b) for(int i=a;i<=b;i++)
    15 #define scan(a) scanf("%d",&a)
    16 #define dbg(args) cout<<#args<<":"<<args<<endl;
    17 #define inf 0x3f3f3f3f
    18 const int maxn=1e6+10;
    19 int n,m,t;
    20 int a[maxn],b[maxn];
    21 ll ans=0;
    22 void mergesort(int* a,int l,int r)
    23 {
    24     if(l==r) return;
    25     int m=l+r>>1;
    26     mergesort(a,l,m);
    27     mergesort(a,m+1,r);
    28     int i=l,j=m+1,cnt=l;
    29     while(i<=m&&j<=r)
    30     {
    31         if(a[i]<=a[j])b[cnt++]=a[i++];
    32         else ans+=m-i+1,b[cnt++]=a[j++];
    33     }
    34     while(i<=m)b[cnt++]=a[i++];
    35     while(j<=r)b[cnt++]=a[j++];
    36     f(i,l,r)a[i]=b[i];
    37 }
    38 int main()
    39 {
    40     //freopen("input.txt","r",stdin);
    41     //freopen("output.txt","w",stdout);
    42     std::ios::sync_with_stdio(false);
    43     scan(n);
    44     f(i,0,n-1)scan(a[i]);
    45     mergesort(a,0,n-1);
    46 //    f(i,0,n-1)pf("%d ",a[i]);
    47 //    pf("
    ");
    48     pf("%lld",ans);
    49  } 
  • 相关阅读:
    eclipse中,把java函数代码折叠/展开 介绍【转】
    苹果开发者账号注册&真机调试
    Objective-C编码规范:26个方面解决iOS开发问题
    iTunes获取下载的安装包
    Mac AppStore下载文件的获取
    Mac 切换Windows 使用虚拟机, 不推荐双系统
    Xcode使用版本
    如何提高代码质量
    ARC的内存管理
    Objective-C 类的继承、方法的重写和重载
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12549069.html
Copyright © 2011-2022 走看看