Luogu P1908 逆序对

Posted gE_nis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1908 逆序对相关的知识,希望对你有一定的参考价值。

题目大意就是求一个序列中逆序对的数目

输入格式:

第一行,一个数n,表示序列中有n个数。

第二行n个数,表示给定的序列。

输出格式:

给定序列中逆序对的数目。

输入样例#1:
6
5 4 2 6 3 1
输出样例#1:
11

说明

对于50%的数据,n≤2500

对于100%的数据,n≤40000。

第一种方法是用归并排序求逆序对

 1 //2017年8月21日17:26:42
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 100001;
 8 int a[maxn];
 9 int temp[maxn];
10 int n;
11 int ans;
12 
13 void merge_sort(int i, int j){
14     if(i == j)
15         return;
16     int mid = (i+j)/2;
17     merge_sort(i, mid);
18     merge_sort(mid+1, j);
19     int l=i, r=mid+1, k=i;
20     for(; k<=j; k++){
21         if(l > mid){
22             temp[k] = a[r];
23             r++;
24         }else if(r > j){
25             temp[k] = a[l];
26             l++;
27         }else if(a[l] <= a[r]){
28             temp[k] = a[l];
29             l++;
30         }else if(a[l] > a[r]){
31             temp[k] = a[r];
32             r++;
33             ans = ans+mid-l+1;
34         }
35     }
36     for(int k=i;k<=j;k++)
37         a[k] = temp[k];
38 }
39 
40 
41 
42 
43 int main(){
44     cin >> n;
45     for(int i=1;i<=n;i++)
46         cin >> a[i];
47     merge_sort(1, n); 
48     
49     cout << ans;
50 
51     return 0;
52 }
53 
54     //暴力解法 
55         /*
56     for(int i=1;i<=n;i++)
57         for(int j=1;j<=n;j++){
58             if(i > j){
59                 if(a[i] < a[j]){
60                     ans++;
61                 }
62             }
63         }
64     
65     cout << ans;
66     */

 

以上是关于Luogu P1908 逆序对的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1908 逆序对 |树状数组

1/31 P1908逆序对 P1774

P1908 逆序对-(树状数组)

P1908 逆序对-(cdq分治)

树状数组 P1908 逆序对

AC日记——逆序对 洛谷 P1908