Submission #1335465

#TimeUsernameProblemLanguageResultExecution timeMemory
1335465ttamxFancy Fence (CEOI20_fancyfence)C++20
100 / 100
21 ms5460 KiB
#include<bits/stdc++.h>

using namespace std;

using ll = long long;

const int N=1e5+5;
const int MOD=1e9+7;

int n;
int h[N],w[N];
ll ans=0,sum=0;
vector<pair<ll,ll>> st; // (h, w)

ll choose2(ll x){
    x%=MOD;
    return (x*(x-1)/2)%MOD;
}

pair<ll,ll> pop(){
    auto [h,w]=st.back();
    st.pop_back();
    sum=(sum-choose2(h+1)*w%MOD+MOD)%MOD;
    return {h,w};
}

void push(ll h,ll w){
    st.push_back({h,w});
    sum=(sum+choose2(h+1)*w%MOD)%MOD;
}

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> h[i];
    }
    for(int i=1;i<=n;i++){
        cin >> w[i];
    }
    for(int i=1;i<=n;i++){
        ans=(ans+choose2(h[i]+1)*choose2(w[i]+1)%MOD)%MOD;
    }
    for(int i=1;i<=n;i++){
        ll len=0;
        while(!st.empty()&&h[i]<st.back().first){
            auto [hh,ww]=pop();
            len=(len+ww)%MOD;
        }
        push(h[i],len);
        ans=(ans+w[i]*sum%MOD)%MOD;
        push(h[i],w[i]);
    }
    cout << ans << "\n";
}
#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...