需要树状数组,线段树会被卡

#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <numeric>
#include <ctime>
#include <string>
#include <bitset>
#include <unordered_map>
#include <unordered_set>

using namespace std;
using ll = long long;
const ll N = 1e5 + 5, mod = 1e9 + 7, inf = 2e18;


ll n, a[N];
ll bit[N]; // 树状数组

// 树状数组的基本操作
void update(int idx, ll val) {
    while (idx < N) {
        bit[idx] += val;
        idx += idx & -idx; // 前往下一节点
    }
}

ll query(int idx) {
    ll sum = 0;
    while (idx > 0) {
        sum += bit[idx];
        idx -= idx & -idx; // 回溯至父节点
    }
    return sum;
}

// 计算快速幂
ll pqmi(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans *= a;
            ans %= mod;
        }
        b >>= 1;
        a *= a;
        a %= mod;
    }
    return ans;
}

void solve() {
    cin >> n;
    vector<ll> vals;

    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        vals.push_back(a[i]);
    }

    // 离散化处理
    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());

    ll ans = 0;

    for (int i = n; i >= 1; i--) {
        // 获取当前值的离散化索引
        int idx = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin() + 1;

        // 查询比当前值小的数量
        ans += query(idx - 1);
        ans %= mod;

        // 更新当前值至树状数组
        update(idx, 1);
    }

    // 最终结果乘以快速幂
    ans *= pqmi(2, n - 2);
    ans %= mod;

    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    int t = 1;
    // cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}