九度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 ull res;
 9 int arr[Max_N], temp[Max_N];
10 void Merge(int *A, int l, int m, int r) {
11     int p = 0;
12     int x = l, y = m + 1;
13     while (x <= m && y <= r) {
14         if (A[x] > A[y]) res += m - x + 1, temp[p++] = A[y++];
15         else temp[p++] = A[x++];
16     }
17     while (x <= m) temp[p++] = A[x++];
18     while (y <= r) temp[p++] = A[y++];
19     for (x = 0; x < p; x++) A[l + x] = temp[x];
20 }
21 void MergeSort(int *A, int l, int r) {
22     int mid;
23     if (l < r) {
24         mid = (l + r) >> 1;
25         MergeSort(A, l, mid);
26         MergeSort(A, mid + 1, r);
27         Merge(A, l, mid, r);
28     }
29 }
30 int main() {
31 #ifdef LOCAL
32     freopen("in.txt", "r", stdin);
33     freopen("out.txt", "w+", stdout);
34 #endif
35     int n;
36     while (~scanf("%d", &n)) {
37         res = 0;
38         for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
39         MergeSort(arr, 0, n - 1);
40         printf("%lld\n", res);
41     }
42     return 0;
43 }

时间: 2024-12-17 13:12:18

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

九度OJ 1534 数组中第K小的数字

题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1524 解决:307 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字. 输入: 输入可能包含多个测试案例. 对于每个测试案例,输入的第一行为三个整数m,n, k(1<=m,n<=100000, 1&l

九度OJ 1351 数组中只出现一次的数字 (位操作)

题目1351:数组中只出现一次的数字 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2597 解决:766 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3 2

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

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

数组中的逆序对-剑指Offer

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

数组中的逆序对(分治)

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

【Sorting】【Array】数组中的逆序对

数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4 样例输出: 5 思路 分治的思想,统计两边内部的逆序对,以及左右两边之间的逆序对 代码 long

剑指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,子数组已排好序,

36 - 求数组中的逆序对

题目描述:http://ac.jobdu.com/problem.php?pid=1348 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 如输入{7,5,6,4}中,共存在5个逆序对:(7,6) (7,5) (7,4) (6,4) (5,4) 解析: 直观思路是: 从第一个数字开始,让它和后面的每个数字比较,找出所有逆序对.时间复杂度O(n2) 改进思路: 只要让一个数字和其他的每个数字比较,那么时间就是O(n2).