Submission #574945

#TimeUsernameProblemLanguageResultExecution timeMemory
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...