Submission #1309301

#TimeUsernameProblemLanguageResultExecution timeMemory
1309301aryanFancy Fence (CEOI20_fancyfence)C++20
100 / 100
20 ms3548 KiB
#include<bits/stdc++.h>
using namespace std;

using i64 = long long;
const int mod = 1e9 + 7;
const int mo = 500000004;
int main(){

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    

    int n;
    cin >> n;
    vector<int> r(n),c(n);
    vector<i64> pref(n);
    for(int i = 0;i < n;i++){
        cin >> r[i];   
    }
    r.push_back(0);
    for(int i = 0;i < n;i++){
        cin >> c[i];
        pref[i] = c[i];
        if(i) pref[i] += pref[i - 1];
    }


    function<i64(int)> S = [&](int x) ->i64{
        i64 tot = ((x * 1LL * (x + 1)) / 2) % mod;
        return tot;
    };

    function<i64(int,int)> P = [&](int l,int r) -> i64{
        if(l > r) return 0LL;
        return (pref[r] - (l ? pref[l - 1] : 0LL)) % mod;
    };

    vector<int> ns(n,n);
    stack<int> st;
    for(int i = n - 1;i >= 0;i--){
        while(!st.empty() && r[i] < r[st.top()]){
            st.pop();
        }
        if(!st.empty()){
            ns[i] = st.top();
        }
        st.push(i);
    }

    vector<int> pdp(n + 1);
    for(int i = n - 1;i >= 0;i--){
        int p = P(0,ns[i] - 1);
        int s = (mod + S(r[i]) - S(r[ns[i]])) % mod;
        pdp[i] = pdp[ns[i]] + ((p * 1LL * s) % mod);
        pdp[i] %= mod;
    }

    vector<int> dp(n + 1);
    for(int i = n - 1;i >= 0;i--){
        int s = (mod + S(r[i]) - S(r[ns[i]])) % mod;
        dp[i] = dp[ns[i]] + s;
        dp[i] %= mod;
    }

    int ans = 0;
    for(int i = 0;i < n;i++){
        int f = (dp[i] * 1LL * P(0,i - 1)) % mod;
        f = (pdp[i] - f + mod) % mod;
        f = (f * 1LL * c[i]) % mod;
        int x = (dp[i] * 1LL * S(c[i] - 1)) % mod;
        ans = ans + ((f - x + mod) % mod);
        ans %= mod;
    }
    cout << ans << '\n';


    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...