Submission #1259149

#TimeUsernameProblemLanguageResultExecution timeMemory
1259149JuanJLBoxes with souvenirs (IOI15_boxes)C++20
35 / 100
1 ms328 KiB
#include "boxes.h"
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define forn(i,a,b) for(int i = a; i< b;i++)
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;


long long delivery(int N, int K, int L, int p[]) {
	ll left = 0;
	ll lleft = 0;
	ll right = 0;
	ll lright= 0;
	
	
	map<ll,ll> m;
	forn(i,0,N) if(p[i]!=0)m[p[i]]++;
	
	vector<pair<ll,ll>> v; 
	v.pb({0,0});
	for(auto i:m) v.pb(i);
	sort(ALL(v));
	
	
	forn(i,0,SZ(v)){
		if(v[i].fst<=L/2) right+=v[i].snd,lright=i;
		else left+=v[i].snd;
	}
	v.pb({L,0});
	
	//cout<<left<<" "<<right<<'\n';
	
	lleft=lright+1;
	
	//cout<<lleft<<" "<<lright<<'\n';
	
	ll res = 0;
	ll k=K;
	
	while(right>=k){
		k=K;
		right-=k;
		res+=v[lright].fst*2;
		
		for(int  i = (int)lright; i>=0; i--){
			
			ll aux =min(v[i].snd,k);
			v[i].snd-=aux;
			k-=aux;
			
			if(k==0 && (v[i].snd>0||i==0)){
				lright=i;
				break;
			}
		}	
		k=K;	
	}//cout<<res<<'\n';
	
	
	k=K;
	while(left>=k){
		k = K;
		left-=k;
		res+=(L-v[lleft].fst)*2;
		
		for(int  i = (int)lleft; i<SZ(v); i++){
			
			ll aux =min(v[i].snd,k);
			v[i].snd-=aux;
			k-=aux;
			
			if(k==0 && (v[i].snd>0||i==(SZ(v)-1))){
				lleft=i;
				break;
			}
		}		
		k=K;
	}
	
	//cout<<res<<'\n';
	
	ll presL = 0;
	ll aux = (L-v[lleft].fst)*2;
	presL=aux + v[lright].fst*2;
	ll newpresL = L; 
	k=K; k-=left;
	if(k<right){ 
		ll raux = 0;
		for(int i = (int)lright; i>=0; i--){
			raux+=v[i].snd;
			if(raux>k){
				newpresL+=v[i].fst*2;
				break;
			}
		}
	}
	
	presL=min(presL,newpresL);
	
	
	ll presR = 0;
	aux = (v[lright].fst)*2;
	presR=aux + (L-v[lleft].fst)*2;
	ll newpresR = L; 
	k=K; k-=right;
	if(k<left){ 
		ll raux = 0;
		for(int i = (int)lleft; i<SZ(v); i++){
			raux+=v[i].snd;
			if(raux>k){
				newpresR+=v[i].fst*2;
				break;
			}
		}
	}
	
	presR=min(presR,newpresR);
	/*cout<<res<<'\n';
	cout<<presL<<" "<<presR<<'\n';*/
	return res+min(presL,presR);
	
    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...