Submission #105459

#TimeUsernameProblemLanguageResultExecution timeMemory
105459polyfishRoller Coaster Railroad (IOI16_railroad)C++14
34 / 100
173 ms9024 KiB
//Pantyhose(black) + glasses = infinity

#include <bits/stdc++.h>
using namespace std;
 
#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "data"

const int64_t INF = 1e18;

int n;
vector<pair<int, int> > a;
int64_t f[1<<16][16];

int64_t dp(int mask, int last) {
	if (__builtin_popcount(mask)==n)
		return 0;

	if (f[mask][last]>-1)
		return f[mask][last];

	int64_t res = INF;

	for (int i=0; i<n; ++i) {
		if (((mask>>i) & 1)==0) {
			int new_mask = mask | (1<<i);
			// if (mask==11 && last==1 && i==2)
			// 	debug();
			res = min(res, dp(new_mask, i) + max(0, a[last].second - a[i].first));
		}
	}

	return f[mask][last] = res;
}

int64_t plan_roller_coaster(vector<int> s, vector<int> t) {
	n = s.size();
	a.resize(n);

	for (int i=0; i<n; ++i)
		a[i] = {s[i], t[i]};
	sort(a.begin(), a.end());

	if (n<=16) {
		memset(f, -1, sizeof(f));
		// debug(dp(1, 0));

		int64_t res = INF;
		for (int i=0; i<n; ++i)
			res = min(res, dp(1<<i, i));
		
		return res;
	}
}

Compilation message (stderr)

railroad.cpp: In function 'int64_t plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:57:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...