Submission #1106602

#TimeUsernameProblemLanguageResultExecution timeMemory
1106602xnqsWatching (JOI13_watching)C++17
50 / 100
190 ms1532 KiB
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <cstring>

int x, p, q;
std::vector<int> arr;
char dp[101][101][101];

char sol(int pos, int a, int b, int cap) {
	if (a>p||b>q) {
		return 0;
	}
	if (pos==x) {
		return 1;
	}
	if (dp[pos][a][b]!=-1) {
		return dp[pos][a][b];
	}
 
	char ret = 0;
	for (int i = pos; i < x; i++) {
		if (arr[i]-arr[pos]+1 <= cap) {
			ret |= sol(i+1,a+1,b,cap);
		}
		if (arr[i]-arr[pos]+1 <= 2*cap) {
			ret |= sol(i+1,a,b+1,cap);
		}
	}
	return dp[pos][a][b] = ret;
}

bool can_solve(int cap, bool debug = 0) {
	if (x<=100) {
		memset(dp,-1,sizeof(dp));
		return sol(0,0,0,cap);
	}
	else {
		std::vector<int> tmp = arr;
		if (debug) {
			for (const auto& i : tmp) {
				std::cout << i << " ";
			}
			std::cout << "\n";
		}
		
		// first use the large cameras
		for (int iterations = 0; iterations < q && !tmp.empty(); iterations++) {
			int w = 2*cap;
			int max = -1, max_l = -1, max_r = -1;
			for (int l = 0, r = 0; r < tmp.size(); r++) {
				while (tmp[r]-tmp[l]+1 > w) {
					++l;
				}
	 
				if (r-l+1>max) {
					max = r-l+1;
					max_l = l;
					max_r = r;
				}
			}
	 
			tmp.erase(tmp.begin()+max_l,tmp.begin()+max_r+1);
			if (debug) {
				std::cout << max_l << " " << max_r << "\n";
				for (const auto& i : tmp) {
					std::cout << i << " ";
				}
				std::cout << "\n";
			}
		}
	 
		// then the small cameras
		for (int iterations = 0; iterations < p && !tmp.empty(); iterations++) {
			int w = cap;
			int max = -1, max_l = -1, max_r = -1;
			for (int l = 0, r = 0; r < tmp.size(); r++) {
				while (tmp[r]-tmp[l]+1 > w) {
					++l;
				}
	 
				if (r-l+1>max) {
					max = r-l+1;
					max_l = l;
					max_r = r;
				}
			}
	 
			tmp.erase(tmp.begin()+max_l,tmp.begin()+max_r+1);
			if (debug) {
				std::cout << max_l << " " << max_r << "\n";
				for (const auto& i : tmp) {
					std::cout << i << " ";
				}
				std::cout << "\n";
			}
		}
		
		return tmp.empty();
	}
}
 
int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);
 
	std::cin >> x >> p >> q;
 
	// we only need at most x cameras in total, out of which we'll greedily take as many big cameras as possible
	if (p+q>x) {
		q = std::min(q, x);
		p = x-q;
	}
 
	for (int i = 0, tmp; i < x; i++) {
		std::cin >> tmp;
		arr.emplace_back(tmp);
	}
 
	std::sort(arr.begin(),arr.end());
	const auto bs = [&]() {
		int ret = 1000000001;
		int l = 1, r = 1000000000;
		while (l<=r) {
			int m = (l+r)>>1;
			if (can_solve(m)) {
				ret = m;
				r = m-1;
			}
			else {
				l = m+1;
			}
		}
		return ret;
	};
 
	std::cout << bs() << "\n";
	//can_solve(bs(),1);
}

Compilation message (stderr)

watching.cpp: In function 'bool can_solve(int, bool)':
watching.cpp:54:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |    for (int l = 0, r = 0; r < tmp.size(); r++) {
      |                           ~~^~~~~~~~~~~~
watching.cpp:80:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |    for (int l = 0, r = 0; r < tmp.size(); r++) {
      |                           ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...