Submission #1147977

#TimeUsernameProblemLanguageResultExecution timeMemory
1147977Dan4LifeFancy Fence (CEOI20_fancyfence)C++20
100 / 100
72 ms5540 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define sz(a) (int)a.size() #define all(a) begin(a), end(a) using ll = long long; using vi = vector<int>; using ar2 = array<int,2>; const int mxN = (int)1e5+10; const ll MOD = (ll)1e9+7; ll n, x; ll h[mxN], pr[mxN]; vector<array<ll,2>> v; ll pick12(ll x){ x%=MOD; return (x*(x+1)/2)%MOD; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; ll ans = 0; set<pair<ll,ll>> S; for(int i = 0; i < n; i++) cin >> h[i]; for(int i = 0; i < n; i++){ cin >> x, v.pb({h[i],x}); pr[i+1] = (pr[i]+x)%MOD; } vi ind(n,0); iota(all(ind),0); sort(all(ind),[&](int i, int j){ return h[i]>h[j]; }); for(auto i : ind){ auto it = S.lower_bound({i,-1}); auto it2 = S.lower_bound({i,-1}); bool le = 0, ri = 0; ll H = h[i]; if(it!=begin(S)) it--,le=(it->second==i-1); if(it2!=end(S)) ri=(it2->first==i+1); int nL=i, nR=i; if(le) nL = it->first; if(ri) nR = it2->second; if(ri){ ll totW = (pr[nR+1]-pr[i+1]+MOD)%MOD; S.erase(*it2); ans-=(pick12(totW)*pick12(H))%MOD; ans+=MOD; ans%=MOD; } if(le){ ll totW = (pr[i]-pr[nL]+MOD)%MOD; S.erase(*it); ans-=(pick12(totW)*pick12(H))%MOD; ans+=MOD; ans%=MOD; } ll totW = (pr[nR+1]-pr[nL]+MOD)%MOD; S.insert({nL,nR}); ans+=(pick12(totW)*pick12(H))%MOD; ans%=MOD; } cout << ans << "\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...