제출 #1361324

#제출 시각아이디문제언어결과실행 시간메모리
1361324lyra_g13Airplane (NOI23_airplane)C++20
22 / 100
46 ms9684 KiB
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

class segtree {
public:
  std::vector<ll> seg;
  ll n;
  segtree(ll n) : n(n), seg(4 * n) {}

  void set(ll v, ll l, ll r, ll idx, ll del) {
    if (idx < l or idx > r) {
      return;
    }
    if (l == r) {
      seg[v] = del;
      return;
    }
    ll m = l + (r - l) / 2;
    set(2 * v, l, m, idx, del);
    set(2 * v + 1, m + 1, r, idx, del);
    seg[v] = max(seg[2 * v], seg[2 * v + 1]);
  }
  void set(ll idx, ll del) {
    set(1, 0, n - 1, idx, del);
  }

  ll q(ll v, ll l, ll r, ll ql, ll qr) {
    if (qr < l or ql > r) {
      return 0;
    }
    if (ql <= l and r <= qr) {
      return seg[v];
    }
    ll m = l + (r - l) / 2;
    return max(q(2 * v, l, m, ql, qr), q(2 * v + 1, m + 1, r, ql, qr));
  }
  ll q(ll ql, ll qr) {
    return q(1, 0, n - 1, ql, qr);
  }
};

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  ll n, m;
  cin >> n >> m;

  vector<ll> a(n);
  ll maxx = 0;
  ll idx = 0;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    if (a[i] >= maxx) {
      maxx = a[i];
      idx = i;
    }
  }
  for (int i = 0; i < m; i++) {
    ll u, v;
    cin >> u >> v;
  }

  vector<ll> need(n);
  segtree st(n);
  for (int i = n - 1; i >= 0; i--) {
    if (i == n - 1)
      need[i] = a[i];
    else
      need[i] = max(need[i + 1] - 1, a[i]);

    st.set(i, need[i]);
  }
  ll ans = 0;
  ll t = 0;
  for (int i = 1; i < n; i++) {
    if (i < idx) {
      if (ans < a[i]) {
        t += max(1LL, a[i] - ans);
        ans = a[i];
      } else if (ans + 1 <= maxx) {
        t++;
        ans++;
      } else if (ans - 1 >= maxx) {
        ans--;
        t++;
      } else {
        t++;
      }
    } else if (i > idx) {
      if (st.q(i, n - 1) >= ans) {
        t++;
      } else {
        t++;
        ans--;
      }
    }
    if (i == idx) {
      if (ans <= a[i]) {
        t += max(1LL, a[i] - ans);
        ans = a[i];
      } else {
        t++;
        ans--;
      }
    }
  }
  if (ans != 0) {
    t += ans;
  }
  cout << t << "\n";
  return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…