#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const long long mod=1e9+7;
long long A[MAXN],B[MAXN],pos[MAXN],dsu[MAXN],sum=0;
bool ck[MAXN];
bool comp(int a,int b) { return A[a]>A[b]; }
int root(int i)
{
if(!dsu[i]) return i;
return dsu[i]=root(dsu[i]);
}
void merge(int i,int j)
{
if((i=root(i))==(j=root(j))) return ;
sum=(sum-B[i]*(B[i]+1)/2%mod+mod)%mod;
sum=(sum-B[j]*(B[j]+1)/2%mod+mod)%mod;
dsu[j]=i,B[i]=(B[i]+B[j])%mod;
sum=(sum+B[i]*(B[i]+1)/2%mod+mod)%mod;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
stack<int> st;
long long ans=0;
for(int i=1;i<=n;i++) cin>>A[i];
for(int i=1;i<=n;i++) cin>>B[i];
for(int i=1;i<=n;i++) pos[i]=i;
sort(pos+1,pos+n+1,comp);
for(int i=1;i<=n;i++)
{
sum=(sum+B[pos[i]]*(B[pos[i]]+1)/2%mod)%mod,ck[pos[i]]=true;
if(ck[pos[i]-1]) merge(pos[i],pos[i]-1);
if(ck[pos[i]+1]) merge(pos[i],pos[i]+1);
if(A[pos[i]]!=A[pos[i+1]]) ans=(ans+sum*A[pos[i]])%mod;
}
cout<<ans;
}
# | 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... |