Submission #1328442

#TimeUsernameProblemLanguageResultExecution timeMemory
1328442repmannWatching (JOI13_watching)C++20
100 / 100
94 ms16124 KiB
#include <bits/stdc++.h>
using namespace std;
int N, P, Q;
int A[2001];
int DP[2001][2001];
int NEXT[2][2001];
bool Check(int w)
{
  for(int i = N, j0 = N + 1, j1 = N + 1; i; i--)
  {
    while((A[j0 - 1] - A[i]) >= w) j0--;
    NEXT[0][i] = j0;
    while((A[j1 - 1] - A[i]) >= (w << 1)) j1--;
    NEXT[1][i] = j1;
  }
//  cout << w << '\n';
//  cout << "0:\n";
//  for(int i = 1; i <= N; i++) cout << NEXT[0][i] << " \n"[i == N];
//  cout << "1:\n";
//  for(int i = 1; i <= N; i++) cout << NEXT[1][i] << " \n"[i == N];
  for(int i = 1; i <= N; i++) fill(DP[i], DP[i] + P + 1, -1);
  DP[1][P] = Q;
  for(int i = 1; i <= N; i++)
  {
    for(int j = 0; j <= P; j++)
    {
      if(DP[i][j] < 0) continue;
      if(j)
      {
        if(NEXT[0][i] > N) return 1;
        DP[NEXT[0][i]][j - 1] = max(DP[i][j], DP[NEXT[0][i]][j - 1]);
      }
      if(DP[i][j])
      {
        if(NEXT[1][i] > N) return 1;
        DP[NEXT[1][i]][j] = max(DP[i][j] - 1, DP[NEXT[1][i]][j]);
      }
    }
  }
  return 0;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N >> P >> Q;
  for(int i = 1; i <= N; i++) cin >> A[i];
  if((P + Q) >= N) {cout << "1\n"; return 0;}
  sort(A + 1, A + N + 1);
  int l = 1, r = 1000000000, s, sol = r;
  while(l <= r)
  {
    s = (l + r) >> 1;
    if(!Check(s)) l = s + 1;
    else {r = s - 1; sol = s;}
  }
  cout << sol << '\n';

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...