https://www.acmicpc.net/problem/7578
<aside> 💡
$A$라인에 있는 기계를 순서대로 $1$부터 $N$까지 번호를 붙이면 $B$번 라인에서 기계들은 자신의 앞에 있는 기계들 중 자신보다 번호가 큰 기계들과 교차하는 쌍을 이루게 된다.
</aside>
Inversion Counting
#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
using namespace std;
typedef long long ll;
class Seg
{
private:
int n;
vector<int> tree;
void upd(int node, int start, int end, int idx, int val)
{
if(idx<start || end<idx) return;
if(start == end){
tree[node]++;
return;
}
int mid = start+end>>1;
upd(2*node, start, mid, idx, val);
upd(2*node+1, mid+1, end, idx, val);
tree[node] = tree[2*node] + tree[2*node+1];
}
int qry(int node, int start, int end, int left, int right)
{
if(end<left || right<start) return 0;
if(left<=start && end<=right) return tree[node];
int mid = start+end>>1;
int l = qry(2*node, start, mid, left, right);
int r = qry(2*node+1, mid+1, end, left, right);
return l+r;
}
public:
void init(int n)
{
this->n = n;
tree.resize(4*n);
}
void upd(int idx, int val) {upd(1, 1, n, idx, val);}
int qry(int l, int r) {return qry(1, 1, n, l, r);}
};
int n;
map<int, int> vtoi;
signed main()
{
FASTIO;
cin >> n;
Seg cnt;
cnt.init(n);
for(int i = 1; i<=n; i++){
int t; cin >> t;
vtoi[t] = i;
}
ll ans = 0;
for(int i = 1; i<=n; i++){
int cur; cin >> cur;
int idx = vtoi[cur];
cnt.upd(idx, 1);
ans += cnt.qry(idx+1, n);
}
cout << ans;
return 0;
}