Submission #1295533

#TimeUsernameProblemLanguageResultExecution timeMemory
1295533krit3379Fancy Fence (CEOI20_fancyfence)C++17
27 / 100
29 ms16612 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 1ll<<60;
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
template <class T>
using V = vector<T>;
template <class T>
using VV = V<V<T>>;
template <class A, class B>
bool chmax(A &a, B b){
    return a < b &&(a = b, true);
}
template <class A, class B>
bool chmin(A &a, B b){
    return b < a &&(a = b, true);
}


template<class T>
vector<int> cartesian_tree(const vector<T> &a){
    int n=a.size(),t=0;
    vector<int> pa(n,-1),st(n);
    REP(i,n){
        int pr=-1;
        while(t&&a[i]<a[st[t-1]])pr=st[--t];
        if(pr!=-1)pa[pr]=i;
        if(t)pa[i]=st[t-1];
        st[t++]=i;
    }
    return pa;
    
}

ll mod=1e9+7;

void testcase(){
    int n;
    cin>>n;
    V<ll> h(n),w(n),qs(n+1);
    REP(i,n)cin>>h[i];
    REP(i,n)cin>>w[i],qs[i+1]=qs[i]+w[i];
    
    V<int> p=cartesian_tree(h);
    V<V<int>> g(n);
    int root;
    REP(i,n){
        if(p[i]==-1)root=i;
        else g[p[i]].push_back(i);
    }
    
    
    auto cal = [&](ll h,ll w) -> ll {
        h%=mod,w%=mod;
        return (h*(h+1)/2%mod)*(w*(w+1)/2%mod)%mod;  
    };
    
    auto add = [&](auto &x,auto y) -> void {
        x+=y%mod;
        if(x<0)x+=mod;
    };
    
    ll ans=0;
    auto dfs = [&](auto &dfs,int now,int l,int r,ll last_h) -> void {
        ll w=qs[r]-qs[l];
        
        add(ans,cal(h[now],w)-cal(last_h,w));
        
        for(auto &x:g[now]){
            if(x<now)dfs(dfs,x,l,now,h[now]);
            else dfs(dfs,x,now+1,r,h[now]);
        }
        
    };
    
    dfs(dfs,root,0,n,0);
    
    cout<<ans<<'\n';
    
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    cout << fixed << setprecision(12);
    int t=1;
    // cin>>t;
    REP(_,t)testcase();
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...