Submission #851297

#TimeUsernameProblemLanguageResultExecution timeMemory
851297Jawad_Akbar_JJFancy Fence (CEOI20_fancyfence)C++14
100 / 100
112 ms29808 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1<<17; int r[N][3]; int w[N]; int h[N]; int pre[N]; int ans = 0; int mod = 1e9 + 7; struct node{ int l,r; node* left; node* right; int ind; bool lft,rgt; node(int ll,int rr){ l = ll; r = rr; left = right = NULL; lft = rgt = false; ind = 0; } void insert(int i){ if(i<l or i>=r) return; if (r-l==1){ ind = i; return; } if (!lft) left = new node(l,(l+r)/2); if (!rgt) right = new node((l+r)/2,r); lft = rgt = true; left->insert(i); right->insert(i); if (h[left->ind]<h[right->ind]) ind = left->ind; else ind = right->ind; } int get(int ll,int rr){ // if (ll==rr) // cout<<ll<<" "<<rr<<endl; ll = max(ll,l); rr = min(rr,r); if (ll>=r or rr<=l) return 0; if (l==ll and r==rr) return ind; int lind = 0; int rind = 0; if (lft) lind = left->get(ll,rr); if (rgt) rind = right->get(ll,rr); if (h[lind]<h[rind]) return lind; return rind; } }; int asd(int a){ int b = a+1; if (a%2) b /= 2; else a /= 2; return (a*b)%mod; } int answer(int W,int H){ int ans = asd(W); int ans2 = asd(H); return (ans*ans2)%mod ; } node* root; void solve(int l,int r,int height){ if (r<l or l>r) return; int ind = root->get(l,r+1); int width = pre[r]-pre[l-1]; if (width<0) width += mod; ans -= answer(width,height); if (ans<0) ans += mod; ans += answer(width,h[ind]); ans %= mod; solve(l,ind-1,h[ind]); solve(ind+1,r,h[ind]); } signed main(){ h[0] = 2e9; root = new node(1,N+1); int n; cin>>n; for (int i=1;i<=n;i++){ cin>>h[i]; root->insert(i); } for (int i=1;i<=n;i++){ cin>>w[i]; pre[i] = pre[i-1] + w[i]; pre[i] %= mod; } solve(1LL,n,0LL); cout<<ans<<endl; }
#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...