제출 #1190648

#제출 시각아이디문제언어결과실행 시간메모리
1190648alexddTriple Jump (JOI19_jumps)C++20
5 / 100
4094 ms3396 KiB
#include <bits/stdc++.h> using namespace std; int n; int a[500005]; int tole[500005],tori[500005],maxsuff[500005]; int solve(int le, int ri) { for(int i=le;i<=ri;i++) { tole[i] = le-1; for(int u=i-1;u>=le;u--) { if(a[u] >= a[i]) { tole[i] = u; break; } } tori[i] = ri+1; for(int u=i+1;u<=ri;u++) { if(a[u] >= a[i]) { tori[i] = u; break; } } } maxsuff[ri+1] = 0; for(int i=ri;i>=le;i--) { maxsuff[i] = max(maxsuff[i+1], a[i]); } int rez=0; for(int c=le;c<=ri;c++) { int st = tole[c]; if(st==le-1) continue; if(c + (c-st) <= ri) rez = max(rez, a[st] + a[c] + maxsuff[c + (c-st)]); } for(int st=le;st<=ri;st++) { int c = tori[st]; if(c==ri+1) continue; if(c + (c-st) <= ri) rez = max(rez, a[st] + a[c] + maxsuff[c + (c-st)]); } return rez; } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } int q; cin>>q; while(q--) { int le,ri; cin>>le>>ri; cout<<solve(le,ri)<<"\n"; } return 0; } /* tori[i] = prima pozitie x din dreapta lui i cu a[x] >= a[i] tole[i] = prima pozitie x din stanga lui i cu a[x] >= a[i] daca ne fixam capatu stanga in le, centru o sa fie in intervalu le+1..tori[le] daca ne fixam centru in c, capatu stanga o sa fie in tole[c]..c-1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...