#include <bits/stdc++.h>
using namespace std;
#define int long long
const int modulo = 1e9+7;
struct UFDS{
vector<int> p,siz;
int ans;
UFDS(int n,vector<int> &w):p(n+1),ans(0){
siz = w;
iota(p.begin(),p.end(),0);
}
int getRoot(int x){
return p[x]==x ? x : p[x]=getRoot(p[x]);
}
void unite(int a,int b){
a = getRoot(a);
b = getRoot(b);
if(a==b)return;
if(siz[a]<siz[b])swap(a,b);
ans+=siz[a]*siz[b];
ans%=modulo;
siz[a]+=siz[b];
siz[a]%=modulo;
p[b]=a;
}
};
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
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];
UFDS dsu(N,w);
vector<pair<int,int>> blocks(N);
for(int i=0;i<N;i++)blocks[i]={h[i+1],i+1};
sort(blocks.rbegin(),blocks.rend());
int ans = 0;
vector<bool> added(N+2);
for(int i=0;i<N;i++){
if(added[blocks[i].second+1])dsu.unite(blocks[i].second,blocks[i].second+1);
if(added[blocks[i].second-1])dsu.unite(blocks[i].second,blocks[i].second-1);
dsu.ans+=(w[blocks[i].second]*(w[blocks[i].second]+1))/2ll;
dsu.ans%=modulo;
added[blocks[i].second]=true;
if(i==N-1 or blocks[i].first!=blocks[i+1].first){
ans += dsu.ans*(((blocks[i].first*(blocks[i].first+1))/2ll)%modulo);
ans%=modulo;
dsu.ans = 0;
}
}
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... |