제출 #1018319

#제출 시각아이디문제언어결과실행 시간메모리
1018319errayFish 3 (JOI24_fish3)C++17
100 / 100
202 ms44244 KiB
// author: erray
#include <bits/stdc++.h>

#ifdef DEBUG
  #include "debug.h"
#else
  #define debug(...) void(37)
#endif

using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int N;
  int64_t D;
  cin >> N >> D;
  vector<int64_t> C(N);
  for (int i = 0; i < N; ++i) {
    cin >> C[i];
  }
  reverse(C.begin(), C.end()); //stupid 

  vector<int64_t> suf_md(N);
  suf_md[N - 1] = C[N - 1] % D;
  for (int i = N - 2; i >= 0; --i) {
    suf_md[i] = suf_md[i + 1] + (D + (C[i] - C[i + 1]) % D) % D;
  }
  vector<int64_t> a(N);
  for (int i = 0; i < N; ++i) {
    a[i] = C[i] - suf_md[i];
    assert(a[i] % D == 0);
    a[i] /= D;
  }
  vector<int64_t> pref(N + 1);
  for (int i = 0; i < N; ++i) {
    pref[i + 1] = pref[i] + a[i];
  }

  int Q;
  cin >> Q;
  vector<int> L(Q), R(Q);
  vector<vector<int>> qs(N);
  for (int i = 0; i < Q; ++i) {
    int ll, rr;
    cin >> ll >> rr;
    --ll, --rr;
    L[i] = N - rr - 1;    //this is stupid too
    R[i] = N - ll - 1;
    qs[L[i]].push_back(i);
  }

  vector<int64_t> ans(Q);
  struct S {
    int ind;
    int64_t pref;
  };
  auto Cost = [&](int l, int r) {
    return (pref[r + 1] - pref[l]) - a[l] * (r - l + 1);
  };

  vector<S> st;   
  st.push_back(S{N, 0});
  for (int i = N - 1; i >= 0; --i) {
    while (int(st.size()) > 1 && a[st.back().ind] >= a[i]) {
      st.pop_back();
    }
    st.push_back(S{i, st.back().pref + Cost(i, st.back().ind - 1)});
    for (auto id : qs[i]) {
      int r = R[id];
      debug(id, r);
      int last = int(lower_bound(st.begin(), st.end(), r, [&](S t, int x) {
        return t.ind > x;
      }) - st.begin());
      if (a[st[last].ind] * D + suf_md[r] < 0) {
        ans[id] = -1;
      } else {
        ans[id] = st.back().pref - st[last].pref + Cost(st[last].ind, r);
      }
    }   
  }
  for (int i = 0; i < Q; ++i) {
    cout << ans[i] << '\n';
  }
}                  
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...