Submission #253200

#TimeUsernameProblemLanguageResultExecution timeMemory
253200rama_pangRabbit Carrot (LMIO19_triusis)C++14
100 / 100
789 ms157048 KiB
#include <bits/stdc++.h>
using namespace std;

using lint = long long;

struct Node {
  int val = 1e9;
  int lazy = 0;
  int lc = 0;
  int rc = 0;
  Node() {}
  Node(int val) : val(val) {}
} d[int(1e7)];

int NewNode() {
  static int ptd = 2;
  return ptd++;
}

void Apply(int &n, int x) {
  if (n == 0) n = NewNode();
  d[n].val += x;
  d[n].lazy += x;
}

void Push(int &n, int &lc, int &rc) {
  if (d[n].lazy > 0) {
    Apply(lc, d[n].lazy);
    Apply(rc, d[n].lazy);
    d[n].lazy = 0;
  }
}

void Pull(int n, int lc, int rc) {
  d[n].val = min(d[lc].val, d[rc].val);
}

void Update(int &n, lint tl, lint tr, lint p, int x) {
  if (n == 0) n = NewNode();
  if (tl == tr) {
    d[n].val = min(d[n].val, x);
    return;
  }
  lint md = (tl + tr) / 2;
  Push(n, d[n].lc, d[n].rc);
  if (p <= md) {
    Update(d[n].lc, tl, md, p, x);
  } else {
    Update(d[n].rc, md + 1, tr, p, x);
  }
  Pull(n, d[n].lc, d[n].rc);
}

int Query(int n, lint tl, lint tr, lint l, lint r) {
  if (n == 0 || r < tl || tr < l || tl > tr || l > r) return 1e9;
  if (l <= tl && tr <= r) return d[n].val;
  lint md = (tl + tr) / 2;
  Push(n, d[n].lc, d[n].rc);
  return min(Query(d[n].lc, tl, md, l, r), Query(d[n].rc, md + 1, tr, l, r));
}

void Add(int &n, lint tl, lint tr, lint l, lint r, int x) {
  if (r < tl || tr < l || tl > tr || l > r) return;
  if (n == 0) n = NewNode();
  if (l <= tl && tr <= r) return Apply(n, x);
  lint md = (tl + tr) / 2;
  Push(n, d[n].lc, d[n].rc);
  Add(d[n].lc, tl, md, l, r, x);
  Add(d[n].rc, md + 1, tr, l, r, x);
  Pull(n, d[n].lc, d[n].rc);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);

  int N, M;
  cin >> N >> M;

  lint base = 1e11;
  lint inf = 1e12;
  int root = NewNode();
  Update(root, 0, inf, base, 0);

  for (int i = 0; i < N; i++) {
    int a;
    cin >> a;
    auto v = Query(root, 0, inf, max(a - M, 0) + base, inf);
    base -= M;
    Add(root, 0, inf, base, inf, 1);
    Update(root, 0, inf, base + a, v);
  }
  
  cout << Query(root, 0, inf, base, inf) << "\n";
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...