답안 #764650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
764650 2023-06-23T17:53:08 Z ind1v 구경하기 (JOI13_watching) C++11
50 / 100
199 ms 8216 KB
#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 <= 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[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;
}

Compilation message

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;
      |               ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 8148 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 8 ms 8148 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 8 ms 8148 KB Output is correct
8 Correct 7 ms 8148 KB Output is correct
9 Correct 8 ms 8188 KB Output is correct
10 Correct 8 ms 8188 KB Output is correct
11 Correct 10 ms 8148 KB Output is correct
12 Correct 8 ms 8148 KB Output is correct
13 Correct 9 ms 8148 KB Output is correct
14 Correct 8 ms 8096 KB Output is correct
15 Correct 8 ms 8148 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 8216 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 10 ms 8216 KB Output is correct
8 Correct 88 ms 8148 KB Output is correct
9 Correct 23 ms 8148 KB Output is correct
10 Correct 18 ms 8192 KB Output is correct
11 Incorrect 199 ms 8148 KB Output isn't correct
12 Halted 0 ms 0 KB -