Submission #1219058

#TimeUsernameProblemLanguageResultExecution timeMemory
1219058duongquanghai08Fancy Fence (CEOI20_fancyfence)C++20
100 / 100
16 ms4972 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
const int inv2 = 500000004;
int n;
int h[N], w[N], ps[N], dp[N];
int l[N];
void Solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> h[i];
    for (int i = 1; i <= n; i++) {
        cin >> w[i];
        ps[i] = ps[i - 1] + w[i];
    }
    long long ans = 0;
    stack<int> st;
    for (int i = 1; i <= n; i++) {
        while (!st.empty() && h[st.top()] >= h[i]) {
            st.pop();
        }
        l[i] = st.empty() ? 0 : st.top();
        st.push(i);
        int sh = h[i] % MOD * (h[i] % MOD + 1) % MOD * inv2 % MOD;
        int sw = w[i] % MOD * (w[i] % MOD + 1) % MOD * inv2 % MOD;
        ans = (ans + sh * sw) % MOD;
        int W1 = (ps[i - 1] - ps[l[i]]);
        W1 = (W1 % MOD + MOD) % MOD;
        int S1 = (dp[l[i]] + W1 * sh) % MOD;
        ans = (ans + S1 * w[i]) % MOD;
        int W2 = (ps[i] - ps[l[i]]);
        W2 = (W2 % MOD + MOD) % MOD;
        dp[i] = (dp[l[i]] + W2 * sh) % MOD;
    }

    cout << ans;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    Solve();
    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...