Submission #1167981

#TimeUsernameProblemLanguageResultExecution timeMemory
1167981IskachunFlooding Wall (BOI24_wall)C++20
100 / 100
2795 ms101448 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int  N = 1e6 + 12, mod = 1e9 + 7;
ll n, a[N], b[N], m, a2[N], b2[N];
ll st[N];
vector<ll> c;

void precalc () {
    for (ll i = 1; i <= n; i++) c.push_back(a[i]), c.push_back(b[i]);
    sort(c.begin(), c.end());
    c.resize(unique(c.begin(), c.end()) - c.begin());
    m = c.size();
    for (ll i = 1; i <= n; i++) {
        a2[i] = lower_bound(c.begin(), c.end(), a[i]) - c.begin() + 1;
        b2[i] = lower_bound(c.begin(), c.end(), b[i]) - c.begin() + 1;
    }
    st[0] = 1;
    for (ll i = 1; i <= n; i++) st[i] = (st[i - 1] + st[i - 1]) % mod;
}
void rev () {
    reverse(a + 1, a + n + 1), reverse(a2 + 1, a2 + n + 1);
    reverse(b + 1, b + n + 1), reverse(b2 + 1, b2 + n + 1);
}
ll res = 0;

ll t[N * 4], f[N * 4], mul[N * 4], dp[N * 4];
void build (ll v = 1, ll left = 0, ll right = m) {
    mul[v] = 1, dp[v] = 0, t[v] = 0;
    if (left == right) {
        if (left) f[v] = c[left - 1];
        else f[v] = 1;
    } else {
        ll mid = (left + right) / 2;
        build(2 * v, left, mid), build(2 * v + 1, mid + 1, right);
        f[v] = (f[2 * v] + f[2 * v + 1]) % mod;
    }
}
void inc (ll v, ll val) {
    mul[v] = (mul[v] * val) % mod;
    t[v] = (t[v] * val) % mod;
    dp[v] = (dp[v] * val) % mod;
}
void push (ll v) {
    if (mul[v] != 1) {
        inc(2 * v, mul[v]), inc(2 * v + 1, mul[v]);
        mul[v] = 1;
    }
}
void update (ll l, ll r, ll v = 1, ll left = 0, ll right = m) {
    if (l > r or left > r or l > right) return;
    if (left >= l and right <= r) inc(v, 2);
    else {
        push(v);
        ll mid = (left + right) / 2;
        update(l, r, 2 * v, left, mid), update(l, r, v * 2 + 1, mid + 1, right);
        t[v] = (t[2 * v] + t[2 * v + 1]) % mod;
        dp[v] = (dp[2 * v] + dp[2 * v + 1]) % mod;
    }
}
ll get (ll l, ll r, ll v = 1, ll left = 0, ll right = m) {
    if (l > r or left > r or l > right) return 0;
    if (left >= l and right <= r) return t[v];
    push(v);
    ll mid = (left + right) / 2;
    return (get(l, r, 2 * v, left, mid) + get(l, r, 2 * v + 1, mid + 1, right)) % mod;
}
void update2 (ll pos, ll val, ll v = 1, ll left = 0, ll right = m) {
    if (left == right) {
        if (val == -1) dp[v] = t[v] = 0;
        else {
            dp[v] += val; dp[v] %= mod;
            t[v] = (dp[v] * f[v]) % mod;
        }
    } else {
        push(v);
        ll mid = (left + right) / 2;
        if (pos <= mid) update2(pos, val, 2 * v, left, mid);
        else update2(pos, val, 2 * v + 1, mid + 1, right);
        t[v] = (t[2 * v] + t[2 * v + 1]) % mod;
        dp[v] = (dp[2 * v] + dp[2 * v + 1]) % mod;
    }
}
ll get2 (ll l, ll r, ll v = 1, ll left = 0, ll right = m) {
    if (l > r or left > r or l > right) return 0;
    if (left >= l and right <= r) return dp[v];
    push(v);
    ll mid = (left + right) / 2;
    return (get2(l, r, v * 2, left, mid) + get2(l, r, 2 * v + 1, mid + 1, right)) % mod;
}
void fun (bool flag) {
    vector<ll> d(m + 1);
    d[0] = 1;
    build();
    update2(0, 1);
    ll it = 0;
    for (ll i = 1; i <= n; i++) {
        ll one = get2(0, a2[i] - 1), two = get2(0, b2[i] - 1);
        while (it < a2[i]) update2(it, -1), it++;
        update(b2[i], m), update2(a2[i], one), update2(b2[i], two);
        res += (t[1] * st[n - i]) % mod; res %= mod;
    }
    if (flag) {
        res -= (t[1] * n) % mod;
        if (res < 0) res += mod;
    }
}
void solve () {
    cin >> n;
    for (ll i = 1; i <= n; i++) cin >> a[i];
    for (ll i = 1; i <= n; i++) {
        cin >> b[i];
        if (a[i] > b[i]) swap(a[i], b[i]);
    }
    precalc();
    fun(1), rev(), fun(0);
    ll v = 1, sum = 0;
    for (ll i = 1; i <= n; i++) {
        sum += a[i], sum += b[i], sum %= mod;
        if (i < n) v *= 2, v %= mod;
    }
    v = (v * sum) % mod;
    cout << (res - v + mod) % mod;
}

int main() {
    //freopen("filename.in", "r", stdin), freopen("filename.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t = 1; //cin >> t;
    while (t--) solve();
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...