Submission #869499

#TimeUsernameProblemLanguageResultExecution timeMemory
869499lalig777Fancy Fence (CEOI20_fancyfence)C++14
0 / 100
1 ms540 KiB
#include <iostream> #include <vector> #include <stack> #include <algorithm> using namespace std; const int m=1e9+7; int main(){ int n; cin>>n; long long int res=0; vector<long long int>horizontales(n+1); vector<long long int>alturas(n); stack<int>pila1; stack<int>pila2; stack<int>pila3; vector<pair<int,int>>siguiente(n, make_pair(-1, n)); vector<int>v(n, -1); for (int i=0; i<n; i++) cin>>alturas[i]; horizontales[0]=0; int x; for (int i=0; i<n; i++){ cin>>x; horizontales[i+1]=(horizontales[i]+x)%m; }for (int i=0; i<n; i++){ while (!pila1.empty()){ if (alturas[pila1.top()]>=alturas[i]) pila1.pop(); else{ siguiente[i].first=pila1.top(); break; } }pila1.push(i); while (!pila2.empty()){ if (alturas[pila2.top()]>=alturas[n-i-1]) pila2.pop(); else{ siguiente[n-i-1].second=pila2.top(); break; } }pila2.push(n-i-1); while (!pila3.empty()){ if (alturas[pila3.top()]<=alturas[i]){ v[i]=pila3.top(); break; }else pila3.pop(); }pila3.push(i); } long long int left=0, right, top, bottom=0; long long int h, w; for (int i=0; i<n; i++){ left=horizontales[i]+m-horizontales[siguiente[i].first+1]; left%=m; right=horizontales[siguiente[i].second]+m-horizontales[siguiente[i].first+1]; right%=m; top=alturas[i]; if (v[i]==-1) bottom=0; else bottom=alturas[v[i]]; long long int a, b; a=right*(right+1)%m; b=left*(left+1)%m; w=(a+m-b)/2; w%=m; a=top*(top+1)%m; b=bottom*(bottom+1)%m; h=(a+m-b)/2; h%=m; res+=(w*h)%m; res%=m; }cout<<res<<endl; 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...