標籤:blog http 資料 art for re
數組中的逆序對
在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數。
輸入:
每個測試案例包括兩行:第一行包含一個整數n,表示數組中的元素個數。其中1 <= n <= 10^5。第二行包含n個整數,每個數組均為int類型。
輸出:
對應每個測試案例,輸出一個整數,表示數組中的逆序對的總數。
範例輸入:
47 5 6 4
範例輸出:
5
思路
分治的思想,統計兩邊內部的逆序對,以及左右兩邊之間的逆序對
代碼
long long merge2part(vector<int>& nums, int start, int mid, int end){ vector<int> tmp; int p = start; int q = mid+1; long long npair = 0; while(p <= mid && q <= end){ if(nums[p]<=nums[q]){ tmp.push_back(nums[p++]); } else{ tmp.push_back(nums[q++]); npair += mid - p + 1;//核心 } } while(p <= mid){ tmp.push_back(nums[p++]); } while(q <= end){ tmp.push_back(nums[q++]); } /* for(int n : tmp){ nums[i++] = n; } */ int i = start; for (vector<int>::iterator it = tmp.begin() ; it != tmp.end(); ++it){ nums[i++] = *it; } return npair;}long long reversePair(vector<int>& nums, int start, int end){ if(start >= end) return 0; int mid = (start + end) /2; long long npair = 0; //根據提供的資料量,估算npair會超出int的範圍 npair += reversePair(nums, start, mid); //mid應該歸前半段(23|45) npair += reversePair(nums, mid+1, end); npair += merge2part(nums, start, mid, end); return npair;}int main() { int a, b; vector<int> nums; while(cin >> a){ nums.clear();//別忘了清零 while (a-- > 0 && cin >> b){ nums.push_back(b); } cout << reversePair(nums, 0, nums.size()-1) << endl; } return 0;}/************************************************************** Problem: 1348 Language: C++ Result: Accepted Time:240 ms Memory:3064 kb****************************************************************/