ZCMU-1203 reverse ordinal number

There are two questions for inverse ordinal numbers. The first one has small data, and violence can be passed directly. This will not work. You need to use merge sorting.

Classmates who have never learned merge sort can read my other blog merge sort sort

topic

1203: Reverse Ordinal Number
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 737 Solved: 166
[Submit][Status][Web Board]
Description
In an arrangement, if the front and back position of a pair of numbers is opposite to the size order, it means the front The number of is not less than the following number, then they are called a reverse order. The total number of inverse orders in an arrangement is called the inverse number of the arrangement.

For example, in 2 4 3 1, 2 1, 4 3, 4 1, 3 1 is the reverse order, and the reverse number is 4. Given a sequence of integers, find the inverse number of the sequence.
Input
multiple sets of test data

Each group of test data is divided into two rows, the first row is a positive integer n (n <= 50000)

The second row has n elements (0 <= A[i] <= 10^9)

Output
each set of test data output one row to indicate the reverse number

Sample Input

4
2 4 3 1
3
1 1 1

Sample Output

4
3

AC code

#include<bits/stdc++.h>
using namespace std;
#define gcd __gcd;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x);
int ans;
void merge(vector<int>&vec,int left,int mid,int right)
{
    
    
    vector<int>helper(right-left+1,0);
    int p1 = left,p2 = mid + 1;
    int index = 0;
    while(p1<=mid&&p2<=right){
    
    
        if(vec[p1]<vec[p2])helper[index++] = vec[p1++];
        else{
    
    
        	//重点在这里,主要要修改p1位大于p2的时候说明在此之后一直到mid的数据都大于p2
            ans += mid - p1 + 1;
            helper[index++] = vec[p2++];
        }
    }
    while(p1<=mid)helper[index++] = vec[p1++];
    while(p2<=right)helper[index++] = vec[p2++];
    //将helper内整理好的数据重新放回vec容器
    for(int i=0;i<helper.size();++i)vec[left+i] = helper[i];
}


//拆分递归
void mergeSort(vector<int>&vec,int left,int right)
{
    
    
    if(left>=right)return;
    int mid = left + ((right-left)>>1);
    mergeSort(vec, left, mid);
    mergeSort(vec,mid+1,right);
    merge(vec,left,mid,right);
}

//重载
void mergeSort(vector<int>&vec){
    
    
    if(vec.size()<2)return;
    mergeSort(vec,0,(int)vec.size()-1);
}

int main(){
    
    
    int n,x;
    while(~scanf("%d",&n)){
    
    
    ans = 0;
    vector<int>vec;
    rep(i, 1, n){
    
    
        scanf("%d",&x);
        vec.push_back(x);
    }
    mergeSort(vec);
//    rep(i, 0, n-1){
    
    
//        if(i!=n-1)cout << vec[i] << " ";
//        else cout << vec[i] << endl;
        cout << ans << endl;
    }
    return 0;
}


Guess you like

Origin blog.csdn.net/DAVID3A/article/details/115262405