제출 #1327530

#제출 시각아이디문제언어결과실행 시간메모리
1327530Johan구경하기 (JOI13_watching)C++20
50 / 100
1097 ms31880 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 2e3 + 5;
const int INF = 1e18;
int n, p, q, a[N], dp[N][N];
bool ok(int x){
  memset(dp, 0, sizeof(dp));
  for(int i = 0; i <= p; i++){
    for(int j = 0; j <= q; j++){
      if(i > 0){
        int l = dp[i - 1][j] + 1, r = n;
        int cur = a[l] + x - 1, best1 = n + 1;
        while(r >= l){
          int mid = (l + r) >> 1;
          if(a[mid] > cur){
            best1 = mid;
            r = mid - 1;
          }
          else l = mid + 1;
        }
        dp[i][j] = max({dp[i][j], dp[i - 1][j], best1 - 1});
      }
      if(j > 0){
        int l = dp[i][j - 1] + 1, r = n;
        int cur = a[l] + 2 * x - 1, best2 = n + 1;
        while(r >= l){
          int mid = (l + r) >> 1;
          if(a[mid] > cur){
            best2 = mid;
            r = mid - 1;
          }
          else l = mid + 1;
        }
        dp[i][j] = max({dp[i][j], dp[i][j - 1], best2 - 1});
      }
    }
  }
  return (dp[p][q] == n);
}
signed main(){
  cin >> n >> p >> q;
  p = min(p, n);
  q = min(q, n);
  for(int i = 1; i <= n; i++)
    cin >> a[i];
  sort(a + 1, a + n + 1);
  int l = 1, r = INF;
  int best = -1;
  while(r >= l){
    int mid = (l + r) >> 1;
    if(ok(mid) == true){
      best = mid;
      r = mid - 1;
    }
    else l = mid + 1;
  }
  cout << best << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...