Submission #1301737

#TimeUsernameProblemLanguageResultExecution timeMemory
1301737mioRice Hub (IOI11_ricehub)C++20
100 / 100
9 ms1868 KiB
#include "ricehub.h"
// #include <dbg.h>
#include <algorithm>
#include <cassert>
#include <iterator>
#include <vector>
using namespace std;
using ull = unsigned long long;
vector<ull> sp;
vector<uint> x;
// 1 2 10
// 1 - 10 + 2 - 10
// 1 + 2 - 10 * 2
// t = {1, 2, 10}
//      0  1  2
// sum do 2 = sp[2]
ull get_ss(uint b, uint e) {
  ull count = e - b;
  ull sum_i = sp[e] - sp[b];
  ull tot_sum = count * x[e];
  ull sum_s = tot_sum - sum_i;
  return sum_s;
}
ull get_sp(uint b, uint e) {
  // 1 2 5 6
  // 2 - 1 + 5 - 1 + 6 - 1
  // 2 + 5 + 6  - 3 * 1
  ull count = e - b;
  ull sum_i = sp[e + 1] - sp[b + 1];
  ull tot_sum = count * x[b];
  ull sum_s = sum_i - tot_sum;
  return sum_s;
}
ull get_dst_ss(uint b, uint v, uint beg_i) {
  ull dst = get_ss(b, beg_i);
  ull count = beg_i - b + 1;
  return dst + count * (v - x[beg_i]);
}
ull get_dst_sp(uint e, uint v, uint beg_i) {
  ull dst = get_sp(beg_i, e);
  ull count = e - beg_i + 1;
  return dst + count * (x[beg_i] - v);
}

ull get_dst(uint b, uint e) {
  // const vector<uint>::iterator beg_it = lower_bound(x.begin(), x.end(), v);
  // uint beg_i = distance(x.begin(), beg_it);
  uint beg_i = (b + e) / 2;
  //         beg_i
  // A  B  v C  D E
  // --- dsta
  //     dstb------
  // ull dsta = (beg_i > 0 ? get_dst_ss(b, v, beg_i - 1) : 0);
  // ull dstb = (beg_i < x.size() ? get_dst_sp(e, v, beg_i) : 0);
  ull dsta = get_ss(b, beg_i);
  ull dstb = get_sp(beg_i, e);
  // dbg(b, e,beg_i, dsta, dstb);
  return dsta + dstb;
}
bool check(uint k, ull b) {
  for (uint i = 0; i + k <= x.size(); i++) {
    if (get_dst(i, i + k - 1) <= b) {
      return true;
    }
  }
  return false;
}
uint slv(uint r, ull b) {
  sp.resize(r + 1);
  sp[0] = 0;
  for (uint i = 0; i < r; i++) {
    sp[i + 1] = sp[i] + x[i];
  }
  uint s = 0, e = r;
  while (s < e) {
    const uint mid = (s + e + 1) / 2;
    if (check(mid, b)) {
      s = mid;
    } else {
      e = mid - 1;
    }
  }
  return s;
}
int besthub(int R, int L, int X[], long long B) {
  x.resize(R);
  copy(X, X + R, x.begin());
  (void)L;
  return slv(R, B);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...