제출 #1143483

#제출 시각아이디문제언어결과실행 시간메모리
1143483adriines06휴가 (IOI14_holiday)C++20
0 / 100
66 ms131072 KiB
#include"holiday.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; long long int findMaxAttraction(int n, int s, int d, int attraction[]) { vector<ll> v(attraction, attraction + n); vector<ll> a1,a2; for(ll &x: v) cin>>x; for(ll i=s;i>=0;i--){ a1.push_back(v[i]); } for(ll i=s;i<n;i++){ a2.push_back(v[i]); } ll l=4*n; vector<vector<ll>>dp1(a1.size(),vector<ll>(l,-1)); vector<vector<bool>>nd1(a1.size(),vector<bool>(l,0)); dp1[0][0]=0; dp1[0][1]=v[s]; nd1[0][0]=0; nd1[0][1]=1; ll b=0,f=1; for(ll i=1;i<a1.size();i++){ for(ll j=b;j<=f;j++){ if(dp1[i-1][j]+a1[i]>dp1[i][j+2]){ nd1[i][j+2]=nd1[i-1][j]; } if(dp1[i-1][j]>dp1[i][j+1]){ nd1[i][j+1]=nd1[i-1][j]; } dp1[i][j+2]=max(dp1[i][j+2], dp1[i-1][j]+a1[i]); dp1[i][j+1]=max(dp1[i][j+1], dp1[i-1][j]); } b=b+1; f=f+2; } vector<ll>k1(f+1,-1); vector<ll>v1(f+1,-1); vector<bool>n1(f+1,false); b=1,f=3; k1[0]=0, k1[1]=v[s]; v1[0]=0, v1[1]=0; n1[0]=0, n1[1]=1; for(ll i=1;i<a1.size();i++){ for(ll j=b;j<=f;j++){ if(dp1[i][j]>k1[j]){ v1[j]=i; if(nd1[i][j]){ n1[j]=1; } } k1[j]=max(k1[j],dp1[i][j]); } b=b+1; f=f+2; } vector<vector<ll>>dp2(a2.size(),vector<ll>(l,-1)); vector<vector<bool>>nd2(a2.size(),vector<bool>(l,0)); dp2[0][0]=0; dp2[0][1]=v[s]; nd2[0][0]=0; nd2[0][1]=1; b=0,f=1; for(ll i=1;i<a2.size();i++){ for(ll j=b;j<=f;j++){ if(dp2[i-1][j]+a2[i]>dp2[i][j+2]){ nd2[i][j+2]=nd2[i-1][j]; } if(dp2[i-1][j]>dp2[i][j+1]){ nd2[i][j+1]=nd2[i-1][j]; } dp2[i][j+2]=max(dp2[i][j+2], dp2[i-1][j]+a2[i]); dp2[i][j+1]=max(dp2[i][j+1], dp2[i-1][j]); } b=b+1; f=f+2; } vector<ll>k2(f+1,-1); vector<ll>v2(f+1,-1); vector<bool>n2(f+1,false); b=1,f=3; k2[0]=0, k2[1]=v[s]; v2[0]=0, v2[1]=0; n2[0]=0, n2[1]=1; for(ll i=1;i<a2.size();i++){ for(ll j=b;j<=f;j++){ if(dp2[i][j]>k2[j]){ v2[j]=i; if(nd2[i][j]){ n2[j]=1; } } k2[j]=max(k2[j],dp2[i][j]); } b=b+1; f=f+2; } ll ans=0; ll av,bv,vf; for(ll i=0;i<k1.size();i++){ if(i>d) break; for(ll j=0;j<k2.size();j++){ ll r=k1[i]+k2[j]; if(n1[i]&&n2[j]){ r-=v[s]; } ll v=min(v1[i],v2[j]); if(i+j+v<=d){ ans=max(ans,r); } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...