#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... |