제출 #764651

#제출 시각아이디문제언어결과실행 시간메모리
764651ind1vWatching (JOI13_watching)C++11
100 / 100
111 ms8236 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2005;

int n, p, q;
long long a[N];
int dp[N][N / 2];
int xx[N], yy[N];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> p >> q;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  if (p + q >= n) {
    cout << 1;
    exit(0);
  }
  sort(a + 1, a + n + 1);
  a[0] = numeric_limits<long long>::min();
  if (q <= p) {
    int l = 1, r = 1000000000, ans = -1;
    while (l <= r) {
      int m = l + r >> 1;
      for (int i = 1, j = 0; i <= n; i++) {
        while (j + 1 < i && a[j + 1] <= a[i] - m) {
          ++j;
        }
        xx[i] = j;
      }
      for (int i = 1, j = 0; i <= n; i++) {
        while (j + 1 < i && a[j + 1] <= a[i] - 2 * m) {
          ++j;
        }
        yy[i] = j;
      }
      memset(dp, 0x3f, sizeof(dp));
      for (int j = 0; j <= q; j++) {
        dp[0][j] = 0;
      }
      for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= q; j++) {
          dp[i][j] = min(dp[i][j], 1 + dp[xx[i]][j]);
          if (j > 0) {
            dp[i][j] = min(dp[i][j], dp[yy[i]][j - 1]);
          }
        }
      }
      if (dp[n][q] <= p) {
        ans = m;
        r = m - 1;
      } else {
        l = m + 1;
      }
    }
    cout << ans;
  } else {
    int l = 1, r = 1000000000, ans = -1;
    while (l <= r) {
      int m = l + r >> 1;
      for (int i = 1, j = 0; i <= n; i++) {
        while (j + 1 < i && a[j + 1] <= a[i] - m) {
          ++j;
        }
        xx[i] = j;
      }
      for (int i = 1, j = 0; i <= n; i++) {
        while (j + 1 < i && a[j + 1] <= a[i] - 2 * m) {
          ++j;
        }
        yy[i] = j;
      }
      memset(dp, 0x3f, sizeof(dp));
      for (int j = 0; j <= p; j++) {
        dp[0][j] = 0;
      }
      for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= p; j++) {
          dp[i][j] = min(dp[i][j], 1 + dp[yy[i]][j]);
          if (j > 0) {
            dp[i][j] = min(dp[i][j], dp[xx[i]][j - 1]);
          }
        }
      }
      if (dp[n][p] <= q) {
        ans = m;
        r = m - 1;
      } else {
        l = m + 1;
      }
    }
    cout << ans;
  }
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

watching.cpp: In function 'int main()':
watching.cpp:28:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   28 |       int m = l + r >> 1;
      |               ~~^~~
watching.cpp:64:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   64 |       int m = l + r >> 1;
      |               ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...