Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <cstdio>
- #include <vector>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- int main() {
- int t;
- cin >> t;
- while(t--) {
- int n;
- cin >> n;
- vector<int> nums;
- int temp;
- int answer = 0;
- while(n--) {
- cin >> temp;
- nums.push_back(temp);
- }
- n = nums.size();
- for(int i=n-1; i>=0; i--) {
- int curr = nums[i];
- /*
- loop invariant: Array[i+1...n-1] is sorted. (in descending order)
- */
- 1
- [m, 7, 4, 3 ,2]
- i k
- 0 1 1 0
- // binary search.. find least mid such that nums[mid] < curr..
- int low = i+1, high = n-1, mid;
- int possiblePivot = -1;
- while(low <= high) {
- mid = low + (high-low)/2;
- if(nums[mid] < curr) {
- possiblePivot = mid;
- high = mid - 1;
- }
- else if (nums[mid] >= curr) {
- low = mid + 1;
- }
- }
- //cout << "PossiblePivot = " << possiblePivot << endl;
- if(possiblePivot != -1) {
- answer += n-possiblePivot;
- }
- int k = i;
- // inserting arr[i] at appropriate place in nums[i+1...n]
- while(k+1 < n && nums[k] < nums[k+1]) {
- swap(nums[k], nums[k+1]);
- k++;
- }
- // cout << "i = " << i << endl;
- // for(k=i; k<n; k++) {
- // cout << nums[k] << " ";
- // }
- // cout << endl;
- }
- cout << answer << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement