#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;
for (int i=0; i<N; i++){
ans += rect(H[i],W[i]);
ans %= mod;
int curr_last=last_mins[i];
for (int j=i-1; j>curr_last; j--){
ans += nc2(root->range_min(j,i)+1)*((W[j]*W[i])%mod);
ans %= mod;
}
ans += (pref[curr_last]*nc2(H[curr_last]+1))%mod * W[i];
ans%=mod;
}
cout<<ans;
}
Compilation message
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){
| ^~~~
fancyfence.cpp: In function 'int32_t main()':
fancyfence.cpp:119:13: warning: unused variable 'sum' [-Wunused-variable]
119 | int ans=0, sum=0;
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
1 ms |
604 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
604 KB |
Output is correct |
3 |
Incorrect |
1 ms |
604 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
45 ms |
668 KB |
Output is correct |
2 |
Execution timed out |
1070 ms |
2688 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
45 ms |
604 KB |
Output is correct |
3 |
Execution timed out |
1074 ms |
2648 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
1 ms |
496 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
1 ms |
604 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |