天天看點

Luogu P4343 [SHOI2015]自動刷題機

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
int n, k, a[A];
bool check1(ll x, ll sum = 0, int tot = 0) {
  for (int i = 1; i <= n; i++) {
    sum += a[i];
    if (sum < 0) sum = 0;
    if (sum >= x) sum = 0, tot++;
  }
  return tot > k;
}
bool check2(ll x, ll sum = 0, int tot = 0) {
  for (int i = 1; i <= n; i++) {
    sum += a[i];
    if (sum < 0) sum = 0;
    if (sum >= x) sum = 0, tot++;
  }
  return tot < k;
}

int main(int argc, char const *argv[]) {
  cin >> n >> k;
  for (int i = 1; i <= n; i++) cin >> a[i];
  /*-----------------min------------------*/
  ll l = 0, r = 1e16;
  while (l <= r) {
    ll m = (l + r) >> 1;
    if (check1(m)) l = m + 1;
    else r = m - 1;
  }
  /*-----------------min-------------------*/
  ll c = 0, b = 0;
  for (int i = 1; i <= n; i++) {
    c += a[i];
    if (c < 0) c = 0;
    if (c >= l) c = 0, b++;
  }
  if (b != k) return puts("-1"), 0;
  if (l) cout << l << " ";
  else cout << 1 << " ";
  /*-----------------max------------------*/
  l = 0, r = 1e16;
  while (l <= r) {
    ll m = (l + r) >> 1;
    if (check2(m)) r = m - 1;
    else l = m + 1;
  }
  cout << r << endl;
  /*-----------------max-------------------*/
}