제출 #574945

#제출 시각아이디문제언어결과실행 시간메모리
574945JasiekstrzUplifting Excursion (BOI22_vault)C++17
100 / 100
726 ms2400 KiB
#include<bits/stdc++.h> #define fi first #define se second using namespace std; const int M=300; const long long INF=1e18L+7; const int Z=M+10; const int ZD=M*M+10; long long t[2*Z+10]; vector<tuple<int,long long,int>> items; long long dp[2*ZD+10]; deque<pair<int,long long>> q; void addq(int j,long long c) { while(!q.empty() && q.back().se<=c) q.pop_back(); q.emplace_back(j,c); return; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int m; long long l; long long ans=0; long long s=0; cin>>m>>l; for(int i=-m;i<=m;i++) cin>>t[Z+i]; if(l<0) { l=-l; for(int i=1;i<=m;i++) swap(t[Z-i],t[Z+i]); } for(int i=-m;i<=m;i++) s+=t[Z+i]*i; if(l-s<=m) { s=0; for(int i=-m;i<=m;i++) { long long tmp; if(i<=0) tmp=t[Z+i]; else tmp=min(t[Z+i],(l-s)/i); if(tmp>0) { ans+=tmp; s+=tmp*i; items.emplace_back(-i,tmp,-1); } if(tmp<t[Z+i]) items.emplace_back(i,t[Z+i]-tmp,1); } } else { s=0; for(int i=m;i>=-m;i--) { long long tmp; if(i>=0) tmp=t[Z+i]; else tmp=max(0LL,min(t[Z+i],(s-l)/(-i))); if(tmp>0) { ans+=tmp; s+=tmp*i; items.emplace_back(-i,tmp,-1); } if(tmp<t[Z+i]) items.emplace_back(i,t[Z+i]-tmp,1); } } if(abs(l-s)>m) { cout<<"impossible\n"; return 0; } for(int i=0;i<=2*ZD;i++) dp[i]=-INF; dp[ZD]=ans; for(auto [v,cnt,c]:items) { if(v>0) { for(int r=0;r<v;r++) { q.clear(); for(int i=r,j=0;i<=2*ZD;i+=v,j++) { addq(j,dp[i]-j*c); if(q.front().fi+cnt<j) q.pop_front(); dp[i]=q.front().se+j*c; } } } else { for(int r=2*ZD;r>2*ZD+v;r--) { q.clear(); for(int i=r,j=0;i>=0;i+=v,j++) { addq(j,dp[i]-j*c); if(q.front().fi+cnt<j) q.pop_front(); dp[i]=q.front().se+j*c; } } } } if(dp[ZD+l-s]<0) cout<<"impossible\n"; else cout<<dp[ZD+l-s]<<"\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...
#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...