제출 #981512

#제출 시각아이디문제언어결과실행 시간메모리
981512antonFish 3 (JOI24_fish3)C++17
28 / 100
1045 ms114924 KiB
#include<bits/stdc++.h> using namespace std; #define int long long int n, d; vector<int> a; vector<int> left_low; vector<vector<pair<int, int>>> bl; vector<int> cumul; void precalc(){ vector<int> st; a[0] = 0; left_low.resize(n+1); for(int i = n; i>=0; i--){ while(st.size()>0 && a[st.back()]>=a[i]){ left_low[st.back()] = i; st.pop_back(); } st.push_back(i); } left_low[0] = 0; bl.resize(20); for(int i = 0; i<20; i++){ bl[i].resize(n+1); } for(int i = 0; i<=n; i++){ bl[0][i] = {left_low[i], a[i] * (i-left_low[i])}; } for(int step = 1; step<20; step++){ for(int i = 0; i<=n; i++){ auto lh = bl[step-1][bl[step-1][i].first]; bl[step][i]={lh.first, lh.second + bl[step-1][i].second}; } } } int Bs(int cur, int lim){ int res = 0; for(int step = 19; step>=0; step--){ if(bl[step][cur].first>=lim){ res += bl[step][cur].second; cur = bl[step][cur].first; } } if(cur>lim){ res += (cur-lim) * a[cur]; } return res; } signed main(){ cin.tie(NULL); ios_base::sync_with_stdio(false); cin>>n>>d; a.resize(n+1); cumul.resize(n+1); cumul[0] = 0; for(int i = 1; i<=n; i++){ cin>>a[i]; cumul[i] = cumul[i-1] + a[i]; } precalc(); int q; cin>>q; for(int i =0; i<q; i++){ int l, r; cin>>l>>r; cout<<cumul[r]-cumul[l-1]-Bs(r, l-1)<<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...