This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int int64_t
#define pii pair<int,int>
const int MOD = 1e9 + 7;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
vector<int> h(n), w(n);
for (int &x:h)cin>>x;
for (int &x:w)cin>>x;
vector<bool> era(n, false);
vector<int> pv(n, 0);
for (int i=1;i<n;i++) {
if (h[i] == h[i-1]) {
era[i]=true;
pv[i]=pv[i-1];
w[pv[i]]+=w[i];
}
else {
pv[i]=i;
}
}
vector<int> th, tw;
for (int i=0;i<n;i++) {
if (!era[i]) {
th.push_back(h[i]);
tw.push_back(w[i]);
}
}
w=tw;h=th;
n = w.size();
vector<bool> ign(n, false);
stack<array<int,2>> s;
vector<int> p(n);
p[0]=w[0];
for (int i=1;i<n;i++) p[i]=p[i-1]+w[i];
vector<int> st(n, 0), en(n, 0), clos(n, 0);
for (int i=0;i<n;i++) {
while (s.size() && s.top()[0] >= h[i]) {
if (s.top()[0] == h[i]) {
ign[i]=true;
}
s.pop();
}
if (s.size() == 0) {
st[i] = 0;
}
else {
st[i] = s.top()[1];
clos[i] = s.top()[0];
}
s.push({h[i], p[i]});
}
while (s.size())s.pop();
for (int i=n-1;i>=0;i--) {
while (s.size() && s.top()[0] >= h[i]) {
s.pop();
}
if (s.size() == 0) {
en[i] = p.back();
}
else {
en[i] = s.top()[1];
if (clos[i] == 0) {
clos[i] = s.top()[0];
}
else {
clos[i] = max(clos[i], s.top()[0]);
}
}
if (i != 0) s.push({h[i], p[i-1]});
}
// for (int i=0;i<n;i++) {
// cout<<st[i]<<" "<<en[i]<<" "<<clos[i]<<" "<<ign[i]<<"\n";
// }
int res=0;
for (int i=0;i<n;i++) {
if (ign[i])continue;
int lenBase = en[i] - st[i] + 1;
int height = h[i];
int bases = (lenBase) % MOD;
bases = (bases * (bases-1)) % MOD;
bases = (500000004 * bases) % MOD;
int fullHeight = (height+1) % MOD;
fullHeight = (fullHeight * (fullHeight - 1)) % MOD;
fullHeight = (500000004 * fullHeight) % MOD;
int fullRect = (fullHeight * bases) % MOD;
int partHeight = (clos[i]+1) % MOD;
partHeight = (partHeight * (partHeight - 1)) % MOD;
partHeight = (500000004 * partHeight) % MOD;
fullRect -= ((partHeight * bases) % MOD);
fullRect += 2*MOD;
fullRect %= MOD;
res += fullRect;
}
res %= MOD;
cout<<res<<"\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... |