#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
const int mod = int(1e9)+7;
vector<pair<ll,pair<ll,ll>>> ev;
set<pair<ll,ll>> seg;
ll cans = 0;
ll res = 0;
ll get_ans(ll rh,ll lh)
{
return (cans * ((rh * (rh+1) /2 - lh * (lh+1) /2)%mod))%mod;
}
ll get_cans(pair<ll,ll> cseg)
{
__int128 len = cseg.second-cseg.first;
return (len * (len+1) / 2) % mod;
}
void ins(pair<ll,ll> tseg)
{
// cout << tseg.first << ' ' << tseg.second << "\n";
auto it = seg.lower_bound(tseg);
pair<ll,ll> ro = {INF,INF};
if(it != seg.end())
ro = (*it);
pair<ll,ll> lo = {-INF,-INF};
if(it != seg.begin())
{
lo = *(--it);
}
if(lo.second == tseg.first)
{
seg.erase(lo);
cans = (cans-get_cans(lo)+mod)%mod;
tseg.first = lo.first;
}
if(ro.first == tseg.second)
{
seg.erase(ro);
cans = (cans-get_cans(ro)+mod)%mod;
tseg.second = ro.second;
}
seg.insert(tseg);
cans = (cans + get_cans(tseg))%mod;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
ll h[n],l[n],r[n];
for(int i = 0;i < n;++i)
{
cin >> h[i];
}
for(int i = 0;i < n;++i)
{
cin >> r[i];
r[i] += (i == 0 ? 0 : r[i-1]);
l[i] = (i == 0 ? 0 : r[i-1]);
ev.push_back({h[i],{l[i],r[i]}});
}
sort(ev.rbegin(),ev.rend());
for(int i = 0;i < ev.size();++i)
{
ins(ev[i].second);
res = (res+get_ans(ev[i].first,(i+1 == ev.size() ? 0 : ev[i+1].first)))%mod;
}
cout << res << "\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... |