Submission #923732

#TimeUsernameProblemLanguageResultExecution timeMemory
923732LalicWatching (JOI13_watching)C++17
100 / 100
529 ms32156 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define int long long

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9+7;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

int n, p, q;
vector<int> arr;

bool check(int w){
	vector<vector<int>> dp(n+1, vector<int>(p+1, INF));
	dp[0][0]=0;
	
	int ptr1=0, ptr2=0;
	for(int i=1;i<=n;i++){
		while(arr[ptr1+1]<=arr[i]-w) ptr1++;
		while(arr[ptr2+1]<=arr[i]-2*w) ptr2++;
		
		for(int j=0;j<=p;j++){
			if(j) dp[i][j]=min(dp[i][j], dp[ptr1][j-1]);
			dp[i][j]=min(dp[i][j], dp[ptr2][j]+1);
		}
	}
	
	int mn=INF;
	for(int i=0;i<=p;i++) mn=min(mn, dp[n][i]);
	
	return mn<=q;
}

void solve(){
	cin >> n >> p >> q; p=min(p, n);
	arr.resize(n+1); arr[0]=-INF;
	for(int i=1;i<=n;i++) cin >> arr[i];
	sort(arr.begin()+1, arr.end());
	
	int l=1, r=5e8, best=-1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			best=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	
	cout << best << "\n";
}

int32_t main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
		
	int tt=1;
	//cin >> tt;
	while(tt--) solve();
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...