Submission #648330

#TimeUsernameProblemLanguageResultExecution timeMemory
648330jamezzzRoller Coaster Railroad (IOI16_railroad)C++17
34 / 100
2074 ms23752 KiB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
#define fi first
#define se second
#define INF 1023456789
#define LINF 1023456789123456789

int n;
ll memo[20][65540];
vector<int> s,t;

ll dp(int i,int msk){
	if(memo[i][msk]!=-1)return memo[i][msk];
	if(msk==(1<<n)-1)return 0;
	ll res=LINF;
	for(int j=0;j<n;++j){
		if((msk&(1<<j))!=0)continue;
		res=min(res,max(t[i]-s[j],0)+dp(j,msk^(1<<j)));
	}
	return memo[i][msk]=res;
}

ll plan_roller_coaster(vector<int> _s,vector<int> _t){
	s=_s,t=_t;
    n=s.size();
    if(n<=16){
		memset(memo,-1,sizeof memo);
		ll ans=LINF;
		for(int i=0;i<n;++i){
			ans=min(ans,dp(i,1<<i));
		}
		return ans;
	}
	else{
		set<ii> ss,tt,sss;
		for(int i=0;i<n;++i){
			ss.insert({s[i],i});
			tt.insert({t[i],i});
		}
		while(ss.size()!=1){
			while(!tt.empty()&&(*tt.begin()).fi<=(*ss.begin()).fi){
				int i=(*tt.begin()).se;
				sss.insert({s[i],i});
				tt.erase(tt.begin());
			}
			if(sss.empty()||(sss.size()==1&&(*sss.begin()).se==(*ss.begin()).se)){
				if((*--ss.end()).fi!=INF){
					int i=(*ss.begin()).se;
					ss.erase(ss.begin());
					sss.erase({s[i],i});
					tt.insert({t[i],i});
					ss.insert({INF,i});
				}
				else{
					return 1;
				}
			}
			else{
				//take the one with lowest s
				auto it=sss.begin();
				if((*sss.begin()).se==(*ss.begin()).se){
					it=next(it);
				}
				auto[_,i]=*ss.begin();
				auto[__,j]=*it;
				ss.erase(ss.begin());
				ss.erase({s[j],j});
				sss.erase(it);
				//new s[j]->t[i];
				t[j]=t[i];
				ss.insert({s[j],j});
				tt.insert({t[j],j});
			}
		}
		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...