九度oj题目1348:数组中的逆序对

题目1348:数组中的逆序对

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2572

解决:606

题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:

每个测试案例包括两行:

第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。

第二行包含n个整数,每个数组均为int类型。

输出:
对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
样例输入:
4
7 5 6 4
样例输出:
5

注意:数据的表示范围!!long long!!

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <queue>
 5 #include <stack>
 6 #include <iostream>
 7 using namespace std;
 8 int a[100005],b[100005];
 9 long long num;
10 void merge(int s,int mid,int e){
11     int p=s,q=mid+1,k=s;
12     while(p<=mid&&q<=e){
13         if(a[p]>a[q]){
14             num+=mid-p+1;//attention
15
16             //cout<<"p: "<<p<<" q: "<<q<<"  "<<num<<endl;
17
18             b[k++]=a[q++];
19         }
20         else{
21             b[k++]=a[p++];
22         }
23     }
24
25     //cout<<mid<<endl;
26
27     if(p>mid){
28         while(k<=e){
29             b[k++]=a[q++];
30         }
31     }
32     else{
33         while(k<=e){
34             b[k++]=a[p++];
35         }
36     }
37     int i;
38     for(i=s;i<=e;i++){
39         a[i]=b[i];
40     }
41 }
42 void mergesort(int s,int e){
43     if(s>=e)
44         return;//attention!!
45     int mid=(s+e)/2;
46
47     //cout<<mid<<endl;
48
49     mergesort(s,mid);
50
51     //cout<<mid<<endl;
52
53     mergesort(mid+1,e);
54     merge(s,mid,e);
55 }
56 int main(){
57     //freopen("D:\\INPUT.txt","r",stdin);
58     int n;
59     while(scanf("%d",&n)!=EOF){
60         int i=0;
61         for(;i<n;i++){
62             scanf("%d",&a[i]);
63             //cout<<a[i]<<endl;
64         }
65         num=0;
66
67         //cout<<n<<endl;
68
69         mergesort(0,n-1);
70         printf("%lld\n",num);
71     }
72     return 0;
73 }
时间: 2024-12-28 20:21:00

九度oj题目1348:数组中的逆序对的相关文章

【算法题目】数组中的逆序对

题目来源:<剑指offer>面试题36 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这两个数组中的逆序对的总数.例如数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4). 下面把<剑指offer>的分析贴上来:                                                                             代码:

九度oj 1348 数组中的逆序对

原题链接:http://ac.jobdu.com/problem.php?pid=1348 归并排序求逆序对... 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 typedef unsigned long long ull; 7 const int Max_N = 100010; 8 u

【剑指offer】题目36 数组中的逆序对

数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对 如:1,2,1,2,1 有3个逆序对 思路:知道O(N2)肯定是错的.开始想hash,试图找到O(n)的算法,想了很久,找不到.后来想到排序,用原数组与排好序的数组对比,我写的快排,还是不对.想了几个小时,无奈看答案,原来是用变形的归并排序.排序真是博大精深,换个样子我就想不到了.... 在牛客网上AC的代码:脑子不清醒,各种小错,提交了好多遍. class Solution { public: void myMergeSort(v

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

数组中的逆序对-剑指Offer

数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路 如果扫描整个数组,每个数字跟后面的数字比较大小,整体的复杂度是O(n^2) 可以利用归并排序的算法的思想,在排序的同时判断前后两个子序列中存在的逆序对,都是从后往前排,如果前面的数大于后面的数,因为都是已经排好序的所以前面的数一定比后面的数都大,逆序对为后面剩下的元素的数量,然后正常排序:若小于,则这个元素不产生逆序对,正常排序.时间复杂度

数组中的逆序对(分治)

题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4 样例输出: 5 1.直接的做法是逐个统计,复杂度是N^2, 2.可以利用归并排序的思想,在排序过程中统

剑指offer系列源码-数组中的逆序对

题目1348:数组中的逆序对 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2133解决:500 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4

(剑指Offer)面试题36:数组中的逆序对

题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数字跟后面的数字比较,如果大于的话,则这两个数字构成了逆序对.(比较简单,这里就不贴出代码) 时间复杂度:O(n^2) 2.归并思想 将数组不断地等分为两个子数组,然后自下而上地统计两个子数组各自的逆序对以及合并后的逆序对. 假设两个子数组左右分别为A,B,长度分为lenA,lenB,子数组已排好序,