Submission #1295533

#TimeUsernameProblemLanguageResultExecution timeMemory
1295533krit3379Fancy Fence (CEOI20_fancyfence)C++17
27 / 100
29 ms16612 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1ll<<60; #define REP(i, n) for (ll i = 0; i < ll(n); i++) template <class T> using V = vector<T>; template <class T> using VV = V<V<T>>; template <class A, class B> bool chmax(A &a, B b){ return a < b &&(a = b, true); } template <class A, class B> bool chmin(A &a, B b){ return b < a &&(a = b, true); } template<class T> vector<int> cartesian_tree(const vector<T> &a){ int n=a.size(),t=0; vector<int> pa(n,-1),st(n); REP(i,n){ int pr=-1; while(t&&a[i]<a[st[t-1]])pr=st[--t]; if(pr!=-1)pa[pr]=i; if(t)pa[i]=st[t-1]; st[t++]=i; } return pa; } ll mod=1e9+7; void testcase(){ int n; cin>>n; V<ll> h(n),w(n),qs(n+1); REP(i,n)cin>>h[i]; REP(i,n)cin>>w[i],qs[i+1]=qs[i]+w[i]; V<int> p=cartesian_tree(h); V<V<int>> g(n); int root; REP(i,n){ if(p[i]==-1)root=i; else g[p[i]].push_back(i); } auto cal = [&](ll h,ll w) -> ll { h%=mod,w%=mod; return (h*(h+1)/2%mod)*(w*(w+1)/2%mod)%mod; }; auto add = [&](auto &x,auto y) -> void { x+=y%mod; if(x<0)x+=mod; }; ll ans=0; auto dfs = [&](auto &dfs,int now,int l,int r,ll last_h) -> void { ll w=qs[r]-qs[l]; add(ans,cal(h[now],w)-cal(last_h,w)); for(auto &x:g[now]){ if(x<now)dfs(dfs,x,l,now,h[now]); else dfs(dfs,x,now+1,r,h[now]); } }; dfs(dfs,root,0,n,0); cout<<ans<<'\n'; } int main(){ cin.tie(0)->sync_with_stdio(0); cout << fixed << setprecision(12); int t=1; // cin>>t; REP(_,t)testcase(); 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...