Submission #1287372

#TimeUsernameProblemLanguageResultExecution timeMemory
1287372Davdav1232Fancy Fence (CEOI20_fancyfence)C++20
100 / 100
73 ms2768 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vll; typedef vector<vll> vvll; typedef pair<ll, ll> pll; const ll MOD=1e9+7; vll h, w, subsum; ll ans=0; void solve(int l, int r){ if(r<=l+1) return; int m=(l+r)/2; solve(l, m); solve(m, r); //now solve for segments between!! //if the h on the right side is strictly smaller: ll mini1=MOD; for(int i=m, j=m; j<r;){ mini1=min(mini1, h[j]); while(i-1>=l && h[i-1]>mini1) i--; ans+=((((subsum[m]-subsum[i]+MOD)%MOD)*(w[j]))%MOD)*((((mini1*mini1+mini1)/2)%MOD)%MOD); ans%=MOD; j++; } mini1=MOD; for(int i=m-1, j=m-1; i>=l;){ mini1=min(mini1, h[i]); while(j+1<r && h[j+1]>=mini1) j++; ans+=((((subsum[j+1]-subsum[m]+MOD)%MOD)*w[i])%MOD)*(((mini1*mini1+mini1)/2)%MOD); ans%=MOD; i--; } } int main(){ int n; cin>>n; h.resize(n); w.resize(n); subsum.assign(n+1, 0); for(int i=0; i<n; i++) cin>>h[i]; for(int i=0; i<n; i++) cin>>w[i]; for(int i=0; i<n; i++) subsum[i+1]=(subsum[i]+w[i])%MOD; for(int i=0; i<n; i++){ ans+=(((h[i]*h[i]+h[i])/2)%MOD)*(((w[i]*w[i]+w[i])/2)%MOD); ans%=MOD; } bool works=1; for(int i=0; i+1<n; i++) if(h[i]>h[i+1]) works=0; if(works){ for(int i=0; i<n; i++){ ans+=((w[i]*(((h[i]*h[i]+h[i])/2)%MOD))%MOD)*(subsum[n]-subsum[i+1]+MOD); ans%=MOD; }} if(!works) solve(0, n); 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...