Submission #947977

#TimeUsernameProblemLanguageResultExecution timeMemory
947977tnknguyen_Fancy Fence (CEOI20_fancyfence)C++14
100 / 100
27 ms6236 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' const int MOD = 1e9 + 7; const int sz = 1e5 + 5; long long INV; long long h[sz], w[sz]; long long s[sz], f[sz]; long long bp(long long a, long long b){ long long ans = 1; while(b){ if(b & 1){ ans = (ans * a) % MOD; } a = (a % MOD) * (a % MOD) % MOD; b >>= 1; } return ans; } long long c2(long long x){ return (x * (x+1) % MOD) * (INV % MOD) % MOD; } long long add(long long a, long long b){ return ((a % MOD) + (b % MOD)) % MOD; } long long mul(long long a, long long b){ return (a % MOD) * (b % MOD) % MOD; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("main.inp","r",stdin); //freopen("main.out","w",stdout); int n; cin>>n; for(int i=1;i<=n;++i){ cin>>h[i]; } for(int i=1;i<=n;++i){ cin>>w[i]; s[i] = (s[i-1] + w[i]) % MOD; } INV = bp(2, MOD-2); stack<int> st; //ascending stack st.push(0); long long ans = 0; for(int i=1;i<=n;++i){ while(st.size() && h[st.top()] >= h[i]){ //h[st.top()] < h[i] st.pop(); } long long len = (s[i] - s[st.top()] + MOD) % MOD; long long l1 = (len - w[i] + MOD) % MOD; long long A = 0; //equal heights. long long B = 0; //smaller heights. //# of sub-rect in current section. A += mul(c2(h[i]), c2(w[i])); //# of sub-rect of section with height >= h[i] appended to current section. A += mul(mul(w[i], l1), c2(h[i])); A %= MOD; B += mul(f[st.top()], w[i]); B %= MOD; f[i] = add(f[st.top()], mul(len, c2(h[i]))); st.push(i); ans = (ans + A + B) % MOD; } cout<<ans; 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...