### 题解:
我们对于这个两个数组a,b;想办法把b排序成a样子,即a中最大对应几号位置,则b中最大也要对应到几号位置
#include<bits/stdc++.h> #define LL long long using namespace std; const int N = 1e5 + 10; int n; class num{ public: LL x; int cnt; }a[N],b[N]; int c[N],p[N]; bool cmp(num &p,num &q) { return p.x < q.x; } int merge_sort(int l,int r) { if(l >= r)return 0; int m = l + r >> 1; int ans = ((merge_sort(l,m) + merge_sort(m + 1,r)) % 99999997); int i = l,j = m + 1,k = 1; while(i <= m && j <= r) { if(c[i] <= c[j])p[k ++] = c[i ++]; else { p[k ++ ] = c[j ++]; ans = (ans + m - i + 1) % 99999997; } } while(i <= m)p[k ++] = c[i ++]; while(j <= r)p[k ++] = c[j ++]; for(int i = l,u = 1;i <= r;++ i,++ u) { c[i] = p[u]; } return ans; } int main () { cin >> n; for(int i = 1;i <= n;++ i) { cin >> a[i].x; a[i].cnt = i; } for(int i = 1;i <= n;++ i) { cin >> b[i].x; b[i].cnt = i; } sort (a + 1,a + n + 1,cmp); sort(b + 1,b + 1 + n,cmp); for(int i = 1;i <= n;++ i) { c[a[i].cnt] = b[i].cnt; } cout << merge_sort(1,n) << "\n"; return 0; }
这里用一个类去存入,值和这个值在最初状态的位置;然后用sort函数加自定义比较方法;如此的结果是a[i]就是第i小,而a[i].cnt又保存了这个的原始位置;紧接着,c数组是存......后面要用到的模板,c[a中第几大的数,的原始位置] = b中第几大的数的位置,如此存完开始归并排序