Submission #1106564

# Submission time Handle Problem Language Result Execution time Memory
1106564 2024-10-30T16:31:21 Z xnqs Watching (JOI13_watching) C++17
50 / 100
1000 ms 16520 KB
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <cstring>

int x, p, q;
std::vector<int> arr;
std::vector<int> next[2];
std::vector<std::vector<std::pair<int,int>>> dp;

std::pair<int,int> solve(int pos, int k, int lambda) {
	if (pos==x) {
		return {0, 0};
	}
	if (dp[pos][k].first!=-1) {
		return dp[pos][k];
	}

	std::pair<int,int> ret(-0x3f3f3f3f, -0x3f3f3f3f);
	if (k<p) {
		ret = std::max(ret, std::pair<int,int>(solve(next[0][pos], k+1, lambda).first + next[0][pos]-pos,
		                                       solve(next[0][pos], k+1, lambda).second));
	}

	ret = std::max(ret, std::pair<int,int>(solve(next[1][pos], k, lambda).first + next[1][pos]-pos - lambda,
	                                       solve(next[1][pos], k, lambda).second + 1));
	return dp[pos][k] = ret;
}

bool can_solve(int cap) {
	bool mode = (p>q);
	for (int i = 0; i < 2; i++) {
		next[i].resize(x);
		for (int l = x-1, r = x-1; l >= 0; l--) {
			while (arr[r]-arr[l]+1>(i+1)*cap) {
				--r;
			}
			next[i][l] = r+1;
		}
	}

	if (mode) {
		std::swap(p,q);
		std::swap(next[0],next[1]);
	}

	const auto bs_lambda = [&]() {
		int ret = -1;
		int l = 0, r = 2000;
		while (l<=r) {
			int m = (l+r)>>1;
			dp = std::vector<std::vector<std::pair<int,int>>>(x,std::vector<std::pair<int,int>>(p+1,std::pair<int,int>(-1,-1)));
			auto [max, cnt] = solve(0,0,m);
			if (cnt<=q) {
				ret = m;
				l = m+1;
			}
			else {
				r = m-1;
			}
		}
		return ret;
	};

	int lambda = bs_lambda();
	auto [max, cnt] = solve(0,0,lambda);
	if (mode) {
		std::swap(p,q);
		std::swap(next[0],next[1]);
	}
	return (max + cnt*lambda == x);
}

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);
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 5 ms 336 KB Output is correct
5 Correct 2 ms 336 KB Output is correct
6 Correct 2 ms 336 KB Output is correct
7 Correct 2 ms 508 KB Output is correct
8 Correct 2 ms 336 KB Output is correct
9 Correct 3 ms 336 KB Output is correct
10 Correct 7 ms 336 KB Output is correct
11 Correct 7 ms 336 KB Output is correct
12 Correct 22 ms 336 KB Output is correct
13 Correct 2 ms 336 KB Output is correct
14 Correct 2 ms 472 KB Output is correct
15 Correct 2 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 592 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Execution timed out 1094 ms 16520 KB Time limit exceeded
4 Halted 0 ms 0 KB -