Submission #1159231

#TimeUsernameProblemLanguageResultExecution timeMemory
1159231alexander7070703단 점프 (JOI19_jumps)C++20
46 / 100
434 ms72904 KiB
#include<bits/stdc++.h> #define MAXN 500007 using namespace std; const int inf=1e9; struct tower{ int val,pos; inline friend bool operator < (tower a,tower b){ return a.val>b.val; } }; int n,ans,q,l,r; tower a[MAXN]; int maxs[MAXN][20]; int lg[MAXN]; int dp[5007][5007]; void calc(){ for(int j=1;j<20;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ maxs[i][j]=max( maxs[i][j-1] , maxs[i+(1<<(j-1))][j-1] ); } } for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1; } int getmax(int l,int r){ if(l>r)return -inf; int len=r-l+1; return max( maxs[l][lg[len]] , maxs[r-(1<<lg[len])+1][lg[len]] ); } void solve_fast(){ sort(a+1,a+n+1); for(int i=1;i<=min(n,20);i++){ for(int f=1;f<=n;f++){ if(i==f)continue; int c=a[i].pos,d=a[f].pos; if(c>d)swap(c,d); ans=max(ans,a[i].val + a[f].val + getmax(c+1,(c+d)/2)); ans=max(ans,a[i].val + a[f].val + getmax(max(c-(d-c),1),c-1)); ans=max(ans,a[i].val + a[f].val + getmax(d+(d-c),n)); } } cout<<ans<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].val; a[i].pos=i; maxs[i][0]=a[i].val; } calc(); if(n>5000){ solve_fast(); return 0; } for(int len=3;len<=n;len++){ for(int i=1;i+len-1<=n;i++){ int f=i+len-1; if(i+2==f)dp[i][f]=a[i].val+a[i+1].val+a[i+2].val; else{ dp[i][f]=max(dp[i][f-1],dp[i+1][f]); dp[i][f]=max(dp[i][f],a[i].val+a[f].val+getmax(i+1,(i+f)/2)); } } } cin>>q; for(int i=1;i<=q;i++){ cin>>l>>r; cout<<dp[l][r]<<"\n"; } 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...