Sunday, June 7, 2015

UVa 231 - Testing the CATCHER

// UVa 231 - Testing the CATCHER
#include <iostream>
#include <string.h>
using namespace std;

int T[65566];

void insert(int h, int s) {
	int n = 32768 + h;
	while (n > 0 && s > T[n]) {
		T[n] = s;
		n = n / 2;
	}
}

int find(int ini, int fin, int n, int h1, int h2) {
	if (ini == h1 && fin == h2)
		return T[n];
	int mid = (ini + fin) / 2;
	if (h2 <= mid)
		return find(ini, mid, 2 * n, h1, h2);
	if (h1 > mid)
		return find(mid + 1, fin, 2 * n + 1, h1, h2);
	int b1 = find(ini, mid, 2 * n, h1, mid);
	int b2 = find(mid + 1, fin, 2 * n + 1, mid + 1, h2);
	return max(b1, b2);
}

int main() {
	int h, cases = 0;
	cin >> h;
	while (h != -1) {
		cases++;

		memset(T, 0, sizeof(T));
		int sol = 0;
		do {
			int b = find(0, 32767, 1, h, 32767);
			insert(h, b + 1);
			if (b > sol)
				sol = b;
			cin >> h;
		} while (h != -1);
		if (cases > 1)
			cout << endl;
		cout << "Test #" << cases << ":" << endl;
		cout << "  maximum possible interceptions: " << sol + 1 << endl;

		cin >> h;
	}

	return 0;
}

No comments:

Post a Comment