#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
const int mod = 1e9 + 7;
const int mo = 500000004;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> r(n),c(n);
vector<i64> pref(n);
for(int i = 0;i < n;i++){
cin >> r[i];
}
r.push_back(0);
for(int i = 0;i < n;i++){
cin >> c[i];
pref[i] = c[i];
if(i) pref[i] += pref[i - 1];
}
function<i64(int)> S = [&](int x) ->i64{
i64 tot = ((x * 1LL * (x + 1)) / 2) % mod;
return tot;
};
function<i64(int,int)> P = [&](int l,int r) -> i64{
if(l > r) return 0LL;
return (pref[r] - (l ? pref[l - 1] : 0LL)) % mod;
};
vector<int> ns(n,n);
stack<int> st;
for(int i = n - 1;i >= 0;i--){
while(!st.empty() && r[i] < r[st.top()]){
st.pop();
}
if(!st.empty()){
ns[i] = st.top();
}
st.push(i);
}
vector<int> pdp(n + 1);
for(int i = n - 1;i >= 0;i--){
int p = P(0,ns[i] - 1);
int s = (mod + S(r[i]) - S(r[ns[i]])) % mod;
pdp[i] = pdp[ns[i]] + ((p * 1LL * s) % mod);
pdp[i] %= mod;
}
vector<int> dp(n + 1);
for(int i = n - 1;i >= 0;i--){
int s = (mod + S(r[i]) - S(r[ns[i]])) % mod;
dp[i] = dp[ns[i]] + s;
dp[i] %= mod;
}
int ans = 0;
for(int i = 0;i < n;i++){
int f = (dp[i] * 1LL * P(0,i - 1)) % mod;
f = (pdp[i] - f + mod) % mod;
f = (f * 1LL * c[i]) % mod;
int x = (dp[i] * 1LL * S(c[i] - 1)) % mod;
ans = ans + ((f - x + mod) % mod);
ans %= mod;
}
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... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |