Wei Li +

【Sorting】【Array】Reverse pairs

##数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 ####输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。 第二行包含n个整数,每个数组均为int类型。 ####输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。 ####样例输入: 4 7 5 6 4 ####样例输出: 5

###思路 分治的思想,统计两边内部的逆序对,以及左右两边之间的逆序对,编程上需要注意mid应该归前半段(23|45)

###代码

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. long long merge2part(vector<int>& nums, int start, int mid, int end){
  5. vector<int> tmp;
  6. int p = start;
  7. int q = mid+1;
  8. long long npair = 0;
  9. while(p <= mid && q <= end){
  10. if(nums[p]<=nums[q]){
  11. tmp.push_back(nums[p++]);
  12. } else{
  13. tmp.push_back(nums[q++]);
  14. npair += mid - p + 1;//核心
  15. }
  16. }
  17. while(p <= mid){
  18. tmp.push_back(nums[p++]);
  19. }
  20. while(q <= end){
  21. tmp.push_back(nums[q++]);
  22. }
  23. /*
  24. for(int n : tmp){
  25. nums[i++] = n;
  26. }
  27. */
  28. int i = start;
  29. for (vector<int>::iterator it = tmp.begin() ; it != tmp.end(); ++it){
  30. nums[i++] = *it;
  31. }
  32. return npair;
  33. }
  34. long long reversePair(vector<int>& nums, int start, int end){
  35. if(start >= end) return 0;
  36. int mid = (start + end) /2;
  37. long long npair = 0; //根据提供的数据量,估算npair会超出int的范围
  38. npair += reversePair(nums, start, mid); //mid应该归前半段(23|45)
  39. npair += reversePair(nums, mid+1, end);
  40. npair += merge2part(nums, start, mid, end);
  41. return npair;
  42. }
  43. int main() {
  44. int a, b;
  45. vector<int> nums;
  46. while(cin >> a){
  47. nums.clear();//别忘了清零
  48. while (a-- > 0 && cin >> b){
  49. nums.push_back(b);
  50. }
  51. cout << reversePair(nums, 0, nums.size()-1) << endl;
  52. }
  53. return 0;
  54. }
  55. /**************************************************************
  56. Problem: 1348
  57. User: Silviacc
  58. Language: C++
  59. Result: Accepted
  60. Time:240 ms
  61. Memory:3064 kb
  62. ****************************************************************/

转载请注明出处:【Sorting】【Array】Reverse pairs

友荐云推荐

AmazingCounters.com

Tech

Life