제출 #704913

#제출 시각아이디문제언어결과실행 시간메모리
704913RandomLB구경하기 (JOI13_watching)C++17
100 / 100
164 ms16084 KiB
#include <bits/stdc++.h> #include <iomanip> using namespace std; typedef long long ll; typedef long double ld; #define pb push_back #define siz(x) (int)x.size() #define ms(x, a) memset(x, a, sizeof(x)) #define deb(...) logger(#__VA_ARGS__, __VA_ARGS__) template<typename ...Args> void logger(string vars, Args&&... values){ cout << vars << " = "; string delim = ""; (...,(cout << delim << values, delim = ", ")); cout << endl; } const int INF = 0x3f3f3f3f; //================================== const int MAX = 2005; int arr[MAX], dp[MAX][MAX], n, p, q; inline int bs(int i, int x){ int l = 0, r = i; while (l+1 < r){ int m = l+(r-l)/2; if (arr[i]-arr[m]+1 <= x) r = m; else l = m; } return r; } bool good(int w){ ms(dp, 0); for (int i = 1; i <= n; i++){ int x = bs(i, w)-1, y = bs(i, 2*w)-1; for (int j = 0; j <= p; j++){ dp[i][j] = min((j? dp[x][j-1] : INF), dp[y][j]+1); } } return dp[n][p] <= q; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> p >> q; if (p+q >= n){ cout << 1 << "\n"; return 0; } for (int i = 1; i <= n; i++) cin >> arr[i]; sort(arr+1, arr+n+1); int l = 1, r = INF; while (l+1 < r){ int m = l+(r-l)/2; (good(m)? r : l) = m; } cout << r << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...