比赛 20251001国庆欢乐赛1 评测结果 AAAAAAAAAA
题目名称 火柴排队 最终得分 100
用户昵称 xuyuqing 运行时间 0.249 s
代码语言 C++ 内存使用 4.14 MiB
提交时间 2025-10-01 09:35:48
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

const int N = 1919810;
const long long MOD = 99999997;

int n;
vector<pair<int, int>> one;
vector<pair<int, int>> two;
int nums[N];
long long tree[N];
long long res;

int lowbit (int id) {
    return (id) & (-id);
}

void add (int id, long long num) {
    for (; id <= n; id += lowbit (id)) {
        tree[id] = (tree[id] + num) % MOD;
    }
}

long long query (int id) {
    long long ans = 0;
    for (; id; id -= lowbit (id)) {
        ans = (ans + tree[id]) % MOD;
    }
    return ans;
}

int main () {
    
    freopen ("MatchNOIP2013.in", "r", stdin);
    freopen ("MatchNOIP2013.out", "w", stdout);
    
    cin >> n;
    int num;
    for (int i = 1; i <= n; i++) {
        cin >> num;
        one.emplace_back(num, i);
    }
    for (int i = 1; i <= n; i++) {
        cin >> num;
        two.emplace_back(num, i);
    }
    
    sort (one.begin(), one.end());
    sort (two.begin(), two.end());
    for (int i = 0; i < one.size(); i++) {
        nums[one[i].second] = two[i].second;
    }
    
    for (int i = 1; i <= n; i++) {
        res = (res + ((query (n) - query (nums[i])) % MOD + MOD) % MOD) % MOD;
        add (nums[i], 1);
    }
    
    cout << res << endl;
    
    return 0;
}