제출 #1193243

#제출 시각아이디문제언어결과실행 시간메모리
1193243mannshah1211Fish 3 (JOI24_fish3)C++17
27 / 100
513 ms42052 KiB
/** * author: tourist * created: 29.04.2025 17:36:20 **/ #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "algo/debug.h" #else #define debug(...) 42 #endif struct Segment { int l, r; Segment(int _l, int _r) : l(_l), r(_r) {} }; class segtree { public: vector<long long> sums, add; int n; segtree(int _n) : n(_n) { sums.resize(4 * n); add.resize(4 * n); } void modify(int l, int r, long long x, int ll, int rr, int v) { if (ll >= r || l >= rr) { return; } if (ll >= l && rr <= r) { add[v] += x; sums[v] += ((long long) (rr - ll)) * x; return; } int m = (ll + rr) >> 1; modify(l, r, x, ll, m, 2 * v + 1); modify(l, r, x, m, rr, 2 * v + 2); sums[v] = sums[2 * v + 1] + sums[2 * v + 2]; } void modify(int l, int r, int x) { modify(l, r, x, 0, n, 0); } long long get(int l, int r, int ll, int rr, int v) { if (ll >= l && rr <= r) { return sums[v]; } if (ll >= r || l >= rr) { return 0; } int m = (ll + rr) >> 1; add[2 * v + 1] += add[v]; add[2 * v + 2] += add[v]; sums[2 * v + 1] += ((long long) (m - ll)) * add[v]; sums[2 * v + 2] += ((long long) (rr - m)) * add[v]; add[v] = 0; return get(l, r, ll, m, 2 * v + 1) + get(l, r, m, rr, 2 * v + 2); } long long get(int l, int r) { return get(l, r, 0, n, 0); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; long long d; cin >> d; vector<long long> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } vector<vector<pair<int, int>>> at(n + 1); int q; cin >> q; for (int qq = 0; qq < q; qq++) { int l, r; cin >> l >> r; at[r].emplace_back(l, qq); } vector<long long> ans(q); vector<Segment> st; st.push_back(Segment(0, 0)); segtree seg(n + 1); for (int i = 1; i <= n; i++) { st.push_back(Segment(i, i)); while (st.size() >= 2) { Segment top = st.back(), sec = st[st.size() - 2]; long long sf = a[top.l] - (d * seg.get(top.l, top.l + 1)), fs = a[sec.r] - (d * seg.get(sec.r, sec.r + 1)); if (sf >= fs) { break; } else { long long more = (fs - sf + d - 1) / d; seg.modify(sec.l, sec.r + 1, more); st.pop_back(); st.pop_back(); st.push_back(Segment(sec.l, top.r)); } } for (auto [l, id] : at[i]) { ans[id] = seg.get(l, i + 1); if (a[l] < d * seg.get(l, l + 1)) { ans[id] = -1; } } } for (int i = 0; i < q; i++) { cout << ans[i] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...