Saturday, May 16, 2015

UVa 11627 - Slalom

// UVa 11627 - Slalom

#include <algorithm>
#include <stdio.h>
using namespace std;

#define ll signed long long int

double epsilon = 1e-10;

ll x[100000], y[100000], s[1000000];
ll w, v;
int n, m;

bool possible(ll s) {
	ll x1 = x[0] * s;
	ll x2 = (x[0] + w) * s;
	for (int i = 1; i < n; i++) {
		ll move = (y[i] - y[i - 1]) * v;
		ll xl = x1 - move;
		ll xr = x2 + move;
		x1 = max(x[i] * s, xl);
		x2 = min((x[i] + w) * s, xr);
		if (x1 > x2)
			return false;
	}
	return true;
}

ll bsearch(ll ini, ll fin) {
	if (ini > fin)
		return -1;
	if (ini == fin) {
		if (possible(s[ini]))
			return ini;
		else
			return -1;
	}
	ll mid = (ini + fin + 1) / 2;
	if (possible(s[mid]))
		return bsearch(mid, fin);
	else
		return bsearch(ini, mid - 1);
}

int main() {
	int t;
	for (scanf("%d", &t); t; t--) {
		scanf("%lld%lld%d", &w, &v, &n);
		for (int i = 0; i < n; i++)
			scanf("%lld%lld", &x[i], &y[i]);
		scanf("%d", &m);
		for (int i = 0; i < m; i++)
			scanf("%lld", &s[i]);
		sort(s, s + m);

		ll sol = bsearch(0, m - 1);
		if (sol == -1)
			printf("IMPOSSIBLE\n");
		else
			printf("%lld\n", s[sol]);

	}
	return 0;
}

No comments:

Post a Comment