ps:鉴于你们的蒟蒻yxj实在太蒻辽, 所以, 看不懂也是正常的........

树状数组

xxy学姐给我们讲的树状数组, 她讲的真的是太好啦!qwq!吹爆xxy

然后, 为了巩固自己, 硬着头皮写题解

题目链接

读完题之后来分析是要求逆序对

可以先离散化

因为我们要顺序存, f1数组的第i小和f2数组的第i小在同一个位置一定就是最优的

然后再求在离散化的那个数组里的逆序对的个数

你们将就着看代码吧,水平不够啊qwq..

#include <iostream>
#include <cstdio>
#include <algorithm>
#define mod 99999997
using namespace std;
const int N = 1000000;
struct node {
    long long h, id;
}f1[N], f2[N];
int n;
int id[N], c[N];
int cmp (node x, node y) {
    return x.h < y.h;
}
int lowbit (int k) {
    return k & (-k);
}
void change (int k) {
    while (k <= n) {
        c[k]++;
        c[k] %= mod;
        k += lowbit (k);
    }
}
int query (int k) {
    long long sum = 0;
    while (k) {
        sum += c[k];
        sum %= mod;
        k -= lowbit (k);
    }
    return sum;
}
int main () {
    scanf ("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf ("%lld", &f1[i].h),f1[i].id = i;
    for (int i = 1; i <= n; i++) 
        scanf ("%lld", &f2[i].h), f2[i].id = i;
    sort (f1 + 1, f1 + 1 + n, cmp);
    sort (f2 + 1, f2 + 1 + n, cmp);
    for (int i = 1; i <= n; i++)
        id[f1[i].id] = f2[i].id;
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        change (id[i]);
        ans += i - query(id[i]);
        ans %= mod; 
    }
    printf ("%lld", ans);;
    return 0;
}