Submission #602635

#TimeUsernameProblemLanguageResultExecution timeMemory
602635CSQ31Uplifting Excursion (BOI22_vault)C++17
100 / 100
817 ms1748 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(a) a.begin(),a.end()
#define owo ios_base::sync_with_stdio(0);cin.tie(0);
typedef long long int ll;
ll a[5000];
ll take[5000];
struct item{
	ll w = 0,v = 0,c = 0;
	item(){}
	item(ll a,ll b,ll _c){
		w = a;
		v = b;
		c = _c;
	}
};
int main()
{
	ll m,L;
	cin>>m>>L;
	for(int i=-m;i<=m;i++)cin>>a[i+m];
	//greedy sol and optimal sol distance small
	ll neg = 0,pos = 0;
	for(ll i=-m;i<=0;i++)neg+=i*a[i+m];
	for(ll i=0;i<=m;i++)pos+=i*a[i+m];
	if(L>pos  || L < neg){
		cout<<"impossible";
		return 0;
	}
	if(neg+pos < L){
		for(int i=1;i<=m;i++)swap(a[i+m],a[-i+m]);
		L*=-1;
	}
	ll sum = 0;
	ll cur = a[m];
	vector<item>b;
	for(ll i=-m;i<=-1;i++){
		sum+=a[i+m] * i;
		cur+=a[i+m];
		a[i+m] = min(a[i+m],2*m);
		if(a[i+m])b.push_back(item(i,-1,a[i+m]));
	}
	//weight value count
	for(int i=1;i<=m;i++){
		take[i] = min(a[i+m],(L-sum)/i);
		a[i+m]-=take[i];
		cur+=take[i];
		sum+=i*1LL*take[i]; //add smtg
		if(a[i+m])b.push_back(item(i,1,min(2*m,a[i+m])));
	}
	for(int i=1;i<=m;i++){ //take smtg away
		if(take[i])b.push_back(item(-i,-1,min(2*m,take[i])));
	}
	int mx = 2*m*m;
	const ll INF = 1e18;
	vector<ll>dp(mx+1,-INF);
	dp[0] = 0;
	for(auto x:b){
		int z = 1;
		vector<int>cc;
		while(x.c>=z){
			cc.push_back(z);
			x.c-=z;
			z*=2;
		}
		if(x.c)cc.push_back(x.c);
		if(x.w > 0){
			for(int y : cc){
				for(int i=mx;i >= y * x.w;i--){
					if(dp[i-y * x.w] != -INF)dp[i] = max(dp[i],dp[i - y * x.w] + y * x.v); 
					
				}	
			}
			
		}else{
			for(int y : cc){
				for(int i=0;i <= mx + y * x.w;i++){
					if(dp[i - y * x.w] != -INF)dp[i] = max(dp[i],dp[i - y * x.w] + y * x.v); 
				}	
			}
			
		}
	}
	if(dp[L-sum] != -INF)cout<<cur+dp[L-sum];
	else cout<<"impossible";
}
#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...