Submission #431052

#TimeUsernameProblemLanguageResultExecution timeMemory
431052KalasLavasBoxes with souvenirs (IOI15_boxes)C++14
100 / 100
799 ms294056 KiB
#include <bits/stdc++.h>
#include "boxes.h"
using namespace std;
#define F first
#define S second
using ll = long long;
using pii= pair<int,int>;
using pll= pair<ll,ll>;
int n,k,len,*p;
ll ans=LLONG_MAX;
ll pref[10000001], suff[10000001];
ll delivery(int _N, int _K, int _L, int _p[])
{
	n=_N; k=_K; len=_L; p=_p;
	
	ans=LLONG_MAX;
	for(int i=0;i<n;i++) pref[i] = (p[i]<<1) + (i<k?0:pref[i-k]);
	for(int i=n-1;i>=0;i--) suff[i] = ((len-p[i])<<1) + (i+k>n?0:suff[i+k]);
		
	for(ll i=0;i<=n;i++)
	{
		ll res = (i==0?0:pref[i-1]);
 
		ll j=i;
		ll l=0,r=(n-i)/k+1,mid;
		while(l<=r)
		{
			mid = (l+r)>>1;
			//cerr<<mid<<"->"<<i+mid*k<<endl;
			if(i+mid*k>=n or (p[i+mid*k]<<1)>=len) r=mid-1;
			else
			{
				l=mid+1;
			}
		}
		j = i+l*k;
		//cerr<<l<<' '<<r<<endl;
		/*for(j=i;j<n;j+=k)
		{
			if((p[j]<<1)>=len)
			{
				break;
			}
			res+=len;
		}*/

		//cerr<<res<<endl;
		res+=suff[j];

		//cerr<<res<<endl;
		res+=(l*len);
		
		//cerr<<i<<' '<<res<<' '<<j<<endl;
		ans = min(res,ans);
	}
	return ans;
}

namespace n2
{
	int n,k,len,*p;
	ll ans=LLONG_MAX;
	ll pref[1000001], suff[1000001];
	ll delivery(int _N, int _K, int _L, int _p[])
	{
		ans=LLONG_MAX;
		n=_N; k=_K; len=_L; p=_p;
		for(int i=0;i<n;i++) pref[i] = (p[i]<<1) + (i<k?0:pref[i-k]);
		for(int i=n-1;i>=0;i--) suff[i] = ((len-p[i])<<1) + (i+k>n?0:suff[i+k]);
			
		for(int i=-1;i<n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				ans = min(ans, (i==-1?0:pref[i]) + suff[j] + (1LL*j-1-i-1+k)/k*len);
				//cerr<<i<<' '<<j<<" - "<<pref[i]<<' '<<suff[j]<<' '<<(1LL*j-1-i-1+k)/k*len<<endl;
			}
			
		}
		return ans;
	}
}

/*
4 8 8
3 4 5 6

4 8 9
3 4 5 6

5 3 26
1 4 13 20 21
:32

5 4 10
4 5 7 8 9
:12

3 2 8
1 2 5
*/
#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...