标签:结果 描述 ext board 范围 输出 end item const
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
7
解题思路:
归并排序。在合并两个区间的时候,当右边的区间比左边区间的值小的时候会产生逆序,如:左区间[7 8],右区间[4 5],那么在4上就会有两个逆序,在5上也会有两个逆序。逆序大小就是左区间中比
右区间某个数大的个数,由于此时左右区间都是有序的,那么可以根据区间长度直接算出逆序个数。
int fz[1000000]; class Solution { public: const int Mod = 1000000007; int _merge(vector<int> &vct, int l, int mid, int r){ if(l >= r){ return 0; } int res = 0; int i = l; int j = mid+1; int pos = 0; while(i <= mid && j <= r){ if(vct[j] < vct[i]){ //右区间当前这个数会产生的逆序个数 res = (res + mid - i + 1) % Mod; fz[pos] = vct[j]; j++; }else{ fz[pos] = vct[i]; i++; } pos++; } while(j <= r){ fz[pos] = vct[j]; pos++; j++; } while(i <= mid){ fz[pos] = vct[i]; pos++; i++; } for( int i = 0; i < pos; i++){ //cout<<" fz[i]="<<fz[i]; vct[l] = fz[i]; l++; } return res; } int Mymerge(vector<int> &vct, int l, int r){ int res = 0; if(l < r){ int mid = (l+r)/2; int lres = Mymerge(vct, l, mid) % Mod; int rres = Mymerge(vct, mid+1, r) % Mod; res = (_merge(vct, l, mid, r) + lres + rres) % Mod; /* cout<<"l="<<l << " mid="<<mid<<" r="<< r <<" res="<<res<<endl; for(int i=l; i <= r; i++){ cout<<vct[i]<<" "; }cout<<endl; */ } return res; } int InversePairs(vector<int> data) { int res = Mymerge(data, 0, data.size()-1) % Mod; return res; } };
标签:结果 描述 ext board 范围 输出 end item const
原文地址:https://www.cnblogs.com/chengsheng/p/10678440.html