https://www.luogu.com.cn/problem/P1966
//P1966 [NOIP2013 提高组] 火柴排队
/*
运用映射转换思想:
顺序 > 乱序 也就是说a的最大和b的最大对应....
定义C数组C[a[i]] = b[i];
问题转化:求C中逆序对个数
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int mod = 1e8 - 3;
int n;
int a[maxn], b[maxn];
int c[maxn];
int bit[maxn];
int lowbit(int x){
return x & -x;
}
void update(int pos, int x){
while (pos <= n){
bit[pos] += x;
pos += lowbit(pos);
}
}
int query(int x){
int res = 0;
while(x){
res += bit[x];
x -= lowbit(x);
}
return res;
}
int un[maxn];
int main () {
cin >> n;
for (int i = 1 ;i <= n ;i++){
cin >> a[i];
un[i] = a[i];
}
sort(un+1,un+1+n);
int m = unique(un+1,un+1+n) - un - 1; // 离散化
for (int i = 1;i <= n;i++){
int id = lower_bound(un+1,un+1+m,a[i]) - un;
a[i] = id;
// cout << a[i] << " ";
}
memset(un, 0, sizeof(un));
for (int i = 1; i <= n; i++){
cin >> b[i];
un[i] = b[i];
}
sort(un+1,un+1+n);
m = 0;
m = unique(un+1,un+1+n) - un - 1; // 离散化
for (int i = 1;i <= n;i++){
int id = lower_bound(un+1,un+1+m,b[i]) - un;
b[i] = id;
// cout << b[i] << " ";
}
for (int i = 1;i <= n ;i++){
c[a[i]] = b[i];
}
// for (int i = 1;i <= n; i++){
// cout<< c[i]<<" ";
// }
int ans = 0;
for (int i = n; i >= 1; i--){
ans += query(c[i] - 1);
update(c[i],1);
}
cout << ans;
return 0;
}