#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 1ll<<60;
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
template <class T>
using V = vector<T>;
template <class T>
using VV = V<V<T>>;
template <class A, class B>
bool chmax(A &a, B b){
return a < b &&(a = b, true);
}
template <class A, class B>
bool chmin(A &a, B b){
return b < a &&(a = b, true);
}
template<class T>
vector<int> cartesian_tree(const vector<T> &a){
int n=a.size(),t=0;
vector<int> pa(n,-1),st(n);
REP(i,n){
int pr=-1;
while(t&&a[i]<a[st[t-1]])pr=st[--t];
if(pr!=-1)pa[pr]=i;
if(t)pa[i]=st[t-1];
st[t++]=i;
}
return pa;
}
ll mod=1e9+7;
void testcase(){
int n;
cin>>n;
V<ll> h(n),w(n),qs(n+1);
REP(i,n)cin>>h[i];
REP(i,n)cin>>w[i],qs[i+1]=qs[i]+w[i];
V<int> p=cartesian_tree(h);
V<V<int>> g(n);
int root;
REP(i,n){
if(p[i]==-1)root=i;
else g[p[i]].push_back(i);
}
auto cal = [&](ll h,ll w) -> ll {
h%=mod,w%=mod;
return (h*(h+1)/2%mod)*(w*(w+1)/2%mod)%mod;
};
auto add = [&](auto &x,auto y) -> void {
x+=y%mod;
x%=mod;
if(x<0)x+=mod;
};
ll ans=0;
auto dfs = [&](auto &dfs,int now,int l,int r,ll last_h) -> void {
ll w=qs[r]-qs[l];
add(ans,cal(h[now],w)-cal(last_h,w));
for(auto &x:g[now]){
if(x<now)dfs(dfs,x,l,now,h[now]);
else dfs(dfs,x,now+1,r,h[now]);
}
};
dfs(dfs,root,0,n,0);
cout<<ans<<'\n';
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cout << fixed << setprecision(12);
int t=1;
// cin>>t;
REP(_,t)testcase();
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... |