码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu P1908 逆序对

时间:2018-02-19 22:54:37      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:格式   题目   using   out   for   strong   就是   归并   names   

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

输入格式:

第一行,一个数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 逆序对

标签:格式   题目   using   out   for   strong   就是   归并   names   

原文地址:https://www.cnblogs.com/sineagle/p/8454539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!