• 洛谷P1908 逆序对【递归】


    题目https://www.luogu.org/problemnew/show/P1908

    题意:给定一个数组,求逆序对个数。

    思路

    是一个很经典的题目了。通过归并排序可以求逆序对个数。

    现在有一个区间,假设左半部分和右半部分都已经有序了,我们要将他们合并成一个区间。

    只需要一个一个比较左半部分当前指向的数和右半部分当前指向的数,哪个小哪个在前就行了。

    如果现在左半部分当前的数比右半部分当前的数要大的话,那么左半部分剩余的数也要比右半部分当前的数大,他们都可以和右半部分当前的数构成逆序。

    所以我们可以通过归并排序计算逆序对的数量。

    对于一个区间,先对左半部分和右半部分排序,排序完成后将他们合并并统计逆序对数量就行了。

    注意这道题要适用long long

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<map>
     4 #include<set>
     5 #include<iostream>
     6 #include<cstring>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<cmath> 
    10 #include<queue>
    11 
    12 #define inf 0x7f7f7f7f
    13 using namespace std;
    14 typedef long long LL;
    15 typedef pair<int, int> pr;
    16 
    17 int n;
    18 const int maxn = 5e5 + 5;
    19 int num[maxn];
    20 int t[maxn]; 
    21 LL ans = 0;
    22 
    23 void msort(int l, int r)
    24 {
    25     if(l == r)return;
    26     int mid = (l + r) / 2;
    27     msort(l, mid);
    28     msort(mid + 1, r);
    29     //合并
    30     int i = l, j = mid + 1, k = l;
    31     while(i <= mid && j <= r){
    32         if(num[i] <= num[j])t[k++] = num[i++];
    33         else{
    34             t[k++] = num[j++];
    35             ans += (LL)mid - i + 1;
    36         }
    37     } 
    38     while(i <= mid)t[k++] = num[i++];
    39     while(j <= r)t[k++] = num[j++];
    40     for(int i = l; i <= r; i++){
    41         num[i] = t[i];
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     scanf("%d", &n);
    48     for(int i = 1; i <= n; i++){
    49         scanf("%d", &num[i]);
    50     } 
    51     msort(1, n);
    52     printf("%lld
    ", ans);
    53     
    54     
    55     return 0;
    56 }
  • 相关阅读:
    Vue如何下载文件?
    vue用template还是JSX?
    2020年的第一件事,我取关了97个公众号
    月经贴 | 2019.12
    CSS——盒子模型(含详解)
    CSS——字体、文本、背景属性设置
    CSS——选择器(三大特性)
    CSS——选择器(本篇介绍八类多种)
    CSS——简介
    WEB前端——body内常用标签(form标签)
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10370232.html
Copyright © 2020-2023  润新知