Submission #1359206

#TimeUsernameProblemLanguageResultExecution timeMemory
1359206kunzaZa183Bigger segments (IZhO19_segments)C++20
100 / 100
125 ms20476 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
  int n;
  cin >> n;
  vector<int> vi(n + 1), qs;

  for (int i = 1; i <= n; i++)
    cin >> vi[i];

  qs = vi;
  for (int i = 1; i <= n; i++)
    qs[i] += qs[i - 1];

  vector<pair<int, int>> idk;
  idk.push_back({vi[1], 1});

  vector<int> bef(n + 1);

  int of = 0;
  for (int i = 2; i <= n; i++) {
    if (vi[i] + of < idk[0].first) {
      bef[i] = bef[idk.back().second];
      idk.push_back({idk.back().first + 2 * vi[i], i});
      of += vi[i];
    } else {
      auto [val, in] = *(upper_bound(idk.begin(), idk.end(),
                                     make_pair(vi[i] + of, LLONG_MAX)) -
                         1);
      bef[i] = in;
      of += vi[i];
      pair<int, int> pii = {qs[i] - qs[in] + of, i};

      while (!idk.empty() && idk.back().first >= pii.first) {
        idk.pop_back();
      }

      idk.push_back(pii);
    }

    // cout << i << " " << idk.size() << " " << of << "\n";
    // for (auto [val, in] : idk)
    //   cout << val << " " << in << "\n";
  }

  int ans = 0;

  int cur = n;
  while (cur > 0) {
    ans++;

    cur = bef[cur];
  }

  // cout << "BEF\n";
  // for (auto a : bef)
  //   cout << a << " ";
  // cout << "\n";

  cout << ans << "\n";
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...