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 long long
#define ii pair<int,int>
typedef vector<int> vi;
#define iii tuple<int,int,int>
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef map<int,int> mii;
#ifndef debug
#define cerr if (0) cerr
#endif
int N,H[10005],W[10005];
int pref[10005], last_mins[10005];
const int mod=1e9+7;
int nc2(int n){
return ((n*(n-1))/2)%mod;
}
int rect(int h, int w){
return (nc2(h+1)*nc2(w+1))%mod;
}
struct node{
int s,e,mn,mx,sum,add_val,set_val;
bool lset;
node *l, *r;
node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){
if (A==NULL) return;
if (s==e) mn=mx=sum=A[s];
else{
l=new node(s, (s+e)>>1,A), r=new node((s+e+2)>>1,e,A);
combine();
}
}
void create_children(){
if (s==e) return;
if (l!=NULL) return;
int m=(s+e)>>1;
l=new node(s,m);
r=new node(m+1,e);
}
void self_set(int v){
lset=1;
mn=mx=set_val=v;
sum=v*(e-s+1);
add_val=0;
}
void self_add(int v){
if (lset) {self_set(v+set_val); return;}
mn+=v, mx+=v, add_val+=v;
sum+=v*(e-s+1);
}
void lazy(){
if (s==e) return;
if (lset){
l->self_set(set_val), r->self_set(set_val);
set_val=0; lset=0;
}
if (add_val!=0){
l->self_add(add_val), r->self_add(add_val);
add_val=0;
}
}
void combine(){
if (l==NULL) return;
sum=l->sum +r->sum;
mn=min(l->mn,r->mn);
mx=max(l->mx,r->mx);
}
#define UPDATE(name)\
void name(int x, int y, int v){\
if (s==x&&e==y) {self_##name(v); return;}\
int m=(s+e)>>1; \
create_children(); lazy();\
if (x<=m) l->name(x,min(y,m),v);\
if (y>m) r->name(max(x,m+1),y,v);\
combine();\
}
UPDATE(add)
UPDATE(set)
#define QUERY(name,fn,var,lazyfn)\
int range_##name(int x, int y){\
if (s==x&&e==y) return var;\
if (l==NULL||lset) return lazyfn(var);\
int m=(s+e)>>1; lazy();\
if (y<=m) return l->range_##name(x,y);\
if (x>m) return r->range_##name(x,y);\
return fn(l->range_##name(x,m), r->range_##name(m+1,y));\
}
#define SAME(var) (var)
#define PART(var) ((var)/(e-s+1)*(y-x+1))
#define SUM(a,b) ((a)+(b))
QUERY(min,min,mn,SAME)
QUERY(max,max,mx,SAME)
QUERY(sum,SUM,sum,PART)
~node(){
if (l!=NULL) delete l;
if (r!=NULL) delete r;
}
}*root;
int32_t main(){
cin>>N;
int last_min = -1;
for (int i=0; i<N; i++)cin>>H[i];
for (int i=0; i<N; i++){
cin>>W[i];
if (i==0) pref[i]=W[i];
else pref[i]=W[i]+pref[i-1];
last_mins[i]=last_min;
if (i>0 && H[i-1]>H[i]){
last_min = i;
}
}
root = new node(0,N-1,H);
int ans=0, sum=0;
stack<iii> st;
for (int i=0; i<N; i++){
ans += rect(H[i],W[i]);
ans %= mod;
int total_w = 0;
while (st.size() && get<0>(st.top()) >= H[i]){
auto [h,w,p] = st.top();
st.pop();
total_w += w;
total_w %= mod;
sum = (sum-p + mod);
sum %= mod;
}
ans += (sum*W[i])%mod;
ans %= mod;
ans += total_w * nc2(H[i]+1)%mod * W[i]%mod;
ans %= mod;
total_w += W[i];
total_w %= mod;
int t = total_w * nc2(H[i]+1);
t %= mod;
sum += t;
sum %= mod;
st.push({H[i], total_w, t});
}
cout<<ans;
}
Compilation message (stderr)
fancyfence.cpp: In constructor 'node::node(long long int, long long int, long long int*)':
fancyfence.cpp:25:7: warning: 'node::lset' will be initialized after [-Wreorder]
25 | bool lset;
| ^~~~
fancyfence.cpp:24:20: warning: 'long long int node::add_val' [-Wreorder]
24 | int s,e,mn,mx,sum,add_val,set_val;
| ^~~~~~~
fancyfence.cpp:27:2: warning: when initialized here [-Wreorder]
27 | node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){
| ^~~~
# | 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... |