另类思路
我们使用两个map分别记录数组a和数组b的位置。
然后再使用两个优先队列。
对于A我们用第一个优先队列找出最大的元素离散化完后的位置。
接下来要做的就是找到B最大值原来所在的位置,赋上A最大值离散化完的位置。
代码
#include <iostream>
#include <vector>
#include <map>
#include <queue>
using namespace std;
typedef long long LL;
vector<int> a;
vector<int> b;
int n;
LL ans = 0;
void merge(vector<int>& a, LL l, LL r)
{
if(l >= r) return;
LL mid = (LL) l + r >> 1;
merge(a, l, mid);
merge(a, mid + 1, r);
vector<int> temp;
int i, j;
for(i = l, j = mid + 1; i <= mid && j <= r;)
{
if(a[i] <= a[j])
{
temp.push_back(a[i]);
i ++;
}
else
{
temp.push_back(a[j]);
ans = (mid + 1 - i + ans) % 99999997;
j ++;
}
}
while(i <= mid) temp.push_back(a[i]), i ++;
while(j <= r) temp.push_back(a[j]), j ++;
for (int k = l; k <= r; k ++) a[k] = temp[k - l];
ans %= 99999997;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
a.resize(n);
b.resize(n);
map<int,int> myMapA;
map<int,int> myMapB;
priority_queue<int> prq1;
priority_queue<int> prq2;
for(int i = 0; i < n; i ++)
{
cin >> a[i];
prq1.push(a[i]);//记录A数组元素
myMapA.insert({a[i],i});//记录A数组每个元素离散化后的位置
}
for(int i = 0; i < n; i ++)
{
int temp;
cin >> temp;
prq2.push(temp);//记录B数组元素
myMapB.insert({temp,i});//记录B数组每个元素本来的位置 这只是记录B元素下标并非离散化啊 并非
} //是为了后续通过 “最大” 这个索引找到它的位置并且赋上A的“最大”的位置
//理论上 i 这个位置放任何不重复值都可以 //目的是找到一个 “位置” 但是怕越界
//最好还是 0 - (n - 1) 免得不必要的麻烦
for(int i = 0; i < n; i ++)
{
int temp = prq1.top();//A数组最大元素
prq1.pop();
int position1 = myMapA[temp];//A最大元素的位置 离散化后
temp = prq2.top();//B数组最大元素
prq2.pop();
int position2 = myMapB[temp];//B最大元素本来的位置
b[position2] = position1;//把B数组最大元素的那个位置更改为A数组最大元素的对应位置
}
merge(b, 0, n - 1);//归并求逆序对
ans %= 99999997;
cout << ans;
return 0;
}