#include <bits/stdc++.h>
 
using namespace std;
 
#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
 
typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;
 
const int MOD = 1e9 + 7;
 
void add(int &x, int v) {
    if ((x += v) >= MOD) x -= MOD;
}
 
void sub(int &x, int v) {
    if ((x -= v) < 0) x += MOD;
}
 
int mul(int a, int b) {
    return int(1LL * a * b % MOD);
}
 
int binpow(int a, int k) {
    int r = 1;
    while (k > 0) {
        if (k % 2 == 1) r = mul(r, a);
        a = mul(a, a), k /= 2;
    }
    return r;
}
 
const int MOD_INV_2 = binpow(2, MOD - 2);
 
const int SZ = 1 << 20;
 
ii st[2 * SZ];
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;
    vector<vi> x(2, vi(n));
    forn(i, 2) forn(j, n) {
        cin >> x[i][j];
    }
    vi pot(n + 1);
    pot[0] = 1;
    forn(i, n) {
        pot[i + 1] = pot[i];
        add(pot[i + 1], pot[i]);
    }
    vi vals(2 * n);
    forn(i, 2) forn(j, n) vals[2 * j + i] = x[i][j];
    sort(all(vals));
    vals.erase(unique(all(vals)), end(vals));
    vector<vi> where(sz(vals));
    forn(t, 2) forn(i, n) {
        int pos = int(lower_bound(all(vals), x[t][i]) - begin(vals));
        where[pos].pb(i);
    }
    vi ret(sz(vals));
    vi m;
    auto init = [&]() {
        m.assign(n, 2);
        forn(i, 2 * SZ) {
            st[i] = {0, 1};
        }
        forn(i, n) st[i + SZ] = {0, m[i]};
        dforsn(u, 1, SZ) {
            st[u].fst = st[2 * u].fst;
            add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); 
            st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd);
        }
    };
    init();
    dforn(i, sz(vals)) {
        for (int j : where[i]) {
            m[j]--;
            st[j + SZ] = {mul(mul(2 - m[j], j), pot[n - j - 1]), m[j]};
            for (int u = j + SZ; u /= 2;) {
                st[u].fst = st[2 * u].fst;
                add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); 
                st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd);
            }
        }
        sub(ret[i], st[1].fst);
    }
    init();
    dforn(i, sz(vals)) {
        for (int j : where[i]) {
            m[j]--;
            st[n - j - 1 + SZ] = {mul(mul(2 - m[j], j + 1), pot[j]), m[j]};
            for (int u = n - j - 1 + SZ; u /= 2;) {
                st[u].fst = st[2 * u].fst;
                add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); 
                st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd);
            }
        }
        add(ret[i], st[1].fst);
    }
    int ans = 0;
    forn(i, sz(vals)) {
        int curr = ret[i], h = vals[i];
        if (i + 1 < sz(vals)) sub(curr, ret[i + 1]);
        add(ans, mul(h, curr));
    }
    int sum = 0;
    forn(i, 2) forn(j, n) add(sum, x[i][j]);
    sub(ans, mul(pot[n - 1], sum));
    cout << ans << '\n';
    
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |