제출 #1251788

#제출 시각아이디문제언어결과실행 시간메모리
1251788EkinOnal구경하기 (JOI13_watching)C++20
0 / 100
1093 ms16272 KiB
//#pragma GCC optimize("O3,unroll-loops,Ofast")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
 
#define MAX 200005
#define pb push_back
// #define mp make_pair 
// #define int long long
#define f first
#define s second
#define vi vector<int>
 
const int INF = 1e9+1;

	
	
void solve(){
	int n,p,q; cin>>n>>p>>q;
	vi v(n+5); for(int i=1;i<=n;i++) cin>>v[i];

	vi arr; for(int i=1;i<=n;i++) arr.pb(v[i]); 
	sort(arr.begin(),arr.end()); //arr.erase(unique(arr.begin(),arr.end()),arr.end());

	int l=1,r=1e9;
	while(l<r){
		int mid=(l+r)>>1;

		vector<vi> dp(n+5,vi(n+5,INF)); for(int i=0;i<=n;i++) dp[0][i]=0;
		for(int i=1;i<=n;i++){
			for(int j=0;j<=n;j++){
				int dist=v[i]-mid+1;

				int idx=lower_bound(arr.begin(),arr.end(),dist+1)-arr.begin();
				if(j) dp[i][j]=min(dp[i][j],dp[idx][j-1]);

				dist=v[i]-2*mid+1;
				idx=lower_bound(arr.begin(),arr.end(),dist+1)-arr.begin();
				dp[i][j]=min(dp[i][j],dp[idx][j]+1);
			}
		}
		
		int mn=0;
		for(int i=0;i<=n;i++){
			if(i<=p && dp[n][i]<=q) mn=1;
		}
		if(mn) r=mid;
		else l=mid+1;
	}	
	cout<<r<<endl;



}	
	
int32_t main(/*	int32_t argc, char* argv[]*/){
	std::ios_base::sync_with_stdio(0); std::cin.tie(0);	

	int t=1;
	// cin >> t;
	while (t--) solve();
 	
	return 0;
}	

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