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