#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
using ll = long long;
using pi = pair<int, int>;
using vi = vector<int>;
template<class T> bool ckmin(T& a, T b) { return b < a ? a = b, true : false; }
template<class T> bool ckmax(T& a, T b) { return a < b ? a = b, true : false; }
#define int ll
const int M = 1e9 + 7;
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int n; cin >> n;
vector<int> h(n + 1), w(n + 1);
for (int i = 1; i <= n; ++i) cin >> h[i];
for (int i = 1; i <= n; ++i) cin >> w[i];
vector<ll> pref(n + 1);
for (int i = 1; i <= n; ++i) pref[i] = pref[i - 1] + w[i];
vector<int> stk;
vector<int> l(n + 1);
for (int i = 1; i <= n; ++i) {
while (!stk.empty() && h[i] <= h[stk.back()]) {
stk.pop_back();
}
if (stk.empty()) {
l[i] = 1;
} else {
l[i] = stk.back()+1;
}
stk.push_back(i);
}
stk.clear();
vector<int> r(n + 1);
for (int i = n; i >= 1; --i) {
while (!stk.empty() && h[i] < h[stk.back()]) {
stk.pop_back();
}
if (stk.empty()) {
r[i] = n;
} else {
r[i] = stk.back()-1;
}
stk.push_back(i);
}
ll ans = 0;
for (int i = 1; i <= n; ++i) {
ll x = (pref[i] - pref[l[i] - 1]) % M * ((pref[r[i]] - pref[i]) % M) % M;
x += (pref[i - 1] - pref[l[i] - 1]) % M * w[i] % M;
x += w[i] * (w[i] + 1) / 2 % M;
x %= M;
ans += (h[i] * (h[i] + 1) / 2) % M * x % M;
ans %= M;
}
cout << ans << "\n";
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |