Submission #1144288

#TimeUsernameProblemLanguageResultExecution timeMemory
1144288mnbvcxz123Fancy Fence (CEOI20_fancyfence)C++20
100 / 100
29 ms3912 KiB
#include<bits/stdc++.h> using namespace std; using ll=long long; constexpr int mod=1e9+7; vector<int>fnxt(vector<ll>&v){ int n=v.size(); vector<int>res(n,n); stack<int>s; for(int i=n-1;i>=0;--i){ while(!s.empty() and v[i]<=v[s.top()])s.pop(); if(!s.empty())res[i]=s.top(); s.push(i); } return res; } vector<int>fprev(vector<ll>&v){ int n=v.size(); vector<int>res(n,0); stack<int>s; for(int i=0;i<n;++i){ while(!s.empty() and v[i]<v[s.top()])s.pop(); if(!s.empty())res[i]=s.top(); s.push(i); } return res; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin>>n; vector<ll>h(n+1),w(n+1),p(n+1); for(int i=1;i<=n;++i)cin>>h[i]; for(int i=1;i<=n;++i){ cin>>w[i]; p[i]=p[i-1]+w[i]; } vector<int>nxt=fnxt(h),prev=fprev(h); ll res=0; for(int i=1;i<=n;++i){ ll ver=h[i]*(h[i]+1ll)/2%mod; ll before=(p[i-1]-p[prev[i]])%mod; ll after=(p[nxt[i]-1]-p[i])%mod; res+=after*before%mod*ver%mod; res+=w[i]*before%mod*ver%mod; res%=mod; res+=w[i]*after%mod*ver%mod; res+=w[i]*(w[i]+1)/2%mod*ver%mod; res%=mod; } cout<<res<<'\n'; }
#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...