제출 #1359981

#제출 시각아이디문제언어결과실행 시간메모리
1359981PetiFish 3 (JOI24_fish3)C++20
100 / 100
155 ms37632 KiB
#include <bits/stdc++.h>
using namespace std;

struct event {
    long long sum;
    long long val;
    int idx;
};

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

    int n;
    long long d;
    cin>>n>>d;

    vector<long long> v(n);
    for(auto &x : v) cin>>x;

    vector<long long> div(n), a(n);
    long long carry = 0;
    for(int i = n-1; i >= 0; i--) {
        div[i] = v[i] / d;
        if(i < n-1 && v[i] % d > v[i + 1] % d) ++carry;
        a[i] = div[i] + carry;
    } 

    vector<long long> pref = a;
    for(int i = 1; i < n; i++) {
        pref[i] += pref[i-1];
    }

    int q;
    cin>>q;
    vector<long long> ans(q);
    vector<vector<pair<int, int>>> query(n);
    for(int i = 0; i < q; i++) {
        int l, r;
        cin>>l>>r;
        --l, --r;
        query[r].emplace_back(l, i);
    }

    vector<event> pq;
    pq.push_back(event{0, -1, -1});
    for(int i = 0; i < n; i++) {
        while(!pq.empty() && pq.back().val >= a[i])  {
            auto [s, x, idx] = pq.back();
            pq.pop_back();
        }
        pq.push_back(event{pq.back().sum + a[i] * (i - pq.back().idx), a[i], i});
        
        for(auto [l, idx] : query[i]) {
            int j = lower_bound(pq.begin(), pq.end(), event{0, 0, l}, [](const event &e1, const event &e2) { return e1.idx < e2.idx; }) - pq.begin();
            ans[idx] = (pref[i] - (l > 0 ? pref[l-1] : 0LL)) - (pq.back().sum - pq[j].sum + (pq[j].idx - l + 1) * pq[j].val);
            if(a[l] - pq[j].val > div[l]) ans[idx] = -1;
        }
    }

    for(auto &x : ans) cout << x << '\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...