제출 #604828

#제출 시각아이디문제언어결과실행 시간메모리
604828errorgornUplifting Excursion (BOI22_vault)C++17
100 / 100
2457 ms7504 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define fi first #define se second #define endl '\n' #define puf push_front #define pof pop_front #define pub push_back #define pob pop_back #define lb lower_bound #define ub upper_bound #define rep(x,s,e) for (int x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e))?x++:x--) #define all(x) (x).begin(),(x).end() #define sz(x) (int) (x).size() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int INF=1e18; int n,k; int arr[305]; //go pos int brr[305]; //go neg int num[305]; //range should be [-neg,pos] const int LEN=150005; int memo[2][2*LEN]; int ans; signed main(){ cin.tie(0); cout.tie(0); cin.sync_with_stdio(false); cin>>n>>k; rep(x,n+1,1) cin>>arr[x]; cin>>ans; rep(x,1,n+1) cin>>brr[x]; rep(x,1,n+1) ans+=arr[x]+brr[x]; int curr=0; rep(x,1,n+1) curr+=(brr[x]-arr[x])*x; rep(x,n+1,1){ if (curr<k) num[x]=min(arr[x],(k-curr)/x); else num[x]=-min(brr[x],(curr-k)/x); curr+=num[x]*x; ans-=abs(num[x]); } rep(x,0,2*LEN) memo[0][x]=-INF; memo[0][LEN]=0; int a=0,b=1; rep(x,1,n+1){ rep(x,0,2*LEN) memo[b][x]=-INF; deque<ii> dq; //(val,pos) rep(res,0,x){ dq.clear(); int r=-1; for (int i=0;res+i*x<2*LEN;i++){ while (res+(r+1)*x<2*LEN && r+1<=i+num[x]){ r++; ii temp={memo[a][res+r*x]+r+(num[x]<0?-2*num[x]:0),r}; while (!dq.empty() && dq.back().fi<=temp.fi) dq.pob(); dq.pub(temp); } while (!dq.empty() && dq.front().se<i+(num[x]-arr[x])) dq.pof(); if (!dq.empty()) memo[b][res+i*x]=dq.front().fi-i; } } dq.clear(); rep(res,0,x){ dq.clear(); int r=-1; for (int i=0;res+i*x<2*LEN;i++){ while (res+(r+1)*x<2*LEN && r+1<=i+(num[x]+brr[x])){ r++; ii temp={memo[a][res+r*x]-r+(num[x]>0?2*num[x]:0),r}; while (!dq.empty() && dq.back().fi<=temp.fi) dq.pob(); dq.pub(temp); } while (!dq.empty() && dq.front().se<i+(num[x])) dq.pof(); if (!dq.empty()) memo[b][res+i*x]=max(memo[b][res+i*x],dq.front().fi+i); } } swap(a,b); //rep(x,0,2*LEN){ //if (memo[a][x]<-INF/10) cout<<"-"<<" "; //else cout<<memo[a][x]<<" "; //} //cout<<endl; } int pos=k-curr+LEN; if (0<=pos && pos<2*LEN && memo[a][pos]>-INF/10) cout<<ans+memo[a][pos]<<endl; else cout<<"impossible"<<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...
#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...