Submission #1256513

#TimeUsernameProblemLanguageResultExecution timeMemory
1256513IcelastFish 3 (JOI24_fish3)C++20
100 / 100
696 ms155556 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e18+9; // Usage: RMQ<int, _min> rmq(a); template<class T, T (*op) (T, T)> struct RMQ { RMQ() = default; RMQ(const vector<T>& v) : t{v}, n{(int) v.size()} { for (int k = 1; (1<<k) <= n; ++k) { t.emplace_back(n - (1<<k) + 1); for (int i = 0; i + (1<<k) <= n; ++i) { t[k][i] = op(t[k-1][i], t[k-1][i + (1<<(k-1))]); } } } // get range [l, r), doesn't work for empty range T get(int l, int r) const { assert(0 <= l && l < r && r <= n); int k = __lg(r - l); return op(t[k][l], t[k][r - (1<<k)]); } private: vector<vector<T>> t; int n; }; template<class T> T _min(T a, T b) { return b < a ? b : a; } template<class T> T _max(T a, T b) { return a < b ? b : a; } void solve(){ ll n, D; cin >> n >> D; vector<ll> c(n+1); for(int i = 1; i <= n; i++){ cin >> c[i]; } vector<ll> b(n+1), a(n+1); ll cur = 0; b[0] = 0; for(int i = 1; i <= n; i++){ b[i] = c[i]%D; if(b[i] < b[i-1]){ b[i] += ((b[i-1] - b[i] - 1) / D + 1) * D; } } for(int i = 1; i <= n; i++){ a[i] = (c[i]-b[i])/D; } vector<ll> pf(n+1, 0); for(int i = 1; i <= n; i++){ pf[i] = pf[i-1] + a[i]; } int B = 20; vector<vector<pair<ll, ll>>> up(B+1, vector<pair<ll, ll>>(n+1, {0, 0})); vector<int> st; st.push_back(0); a[0] = -INF; vector<int> lt(n+1, 0); for(int i = 1; i <= n; i++){ while(a[st.back()] >= a[i]){ st.pop_back(); } lt[i] = st.back(); st.push_back(i); } for(int i = 1; i <= n; i++){ up[0][i] = {lt[i], (pf[i] - pf[lt[i]]) - a[i] * (i - lt[i])}; } for(int j = 1; j <= B; j++){ for(int i = 1; i <= n; i++){ int v = up[j-1][i].first; up[j][i] = {up[j-1][v].first, up[j-1][i].second+up[j-1][v].second}; } } RMQ<ll, _min> T(a); int q; cin >> q; for(int it = 1; it <= q; it++){ int l, r; cin >> l >> r; if(T.get(l, r+1) + b[l]/D < 0){ cout << -1 << "\n"; continue; } ll ans = 0; for(int j = 20; j >= 0; j--){ if(up[j][r].first+1 >= l){ ans += up[j][r].second; r = up[j][r].first; } } ans += (pf[r] - pf[l-1]) - a[r] * (r - l + 1); cout << ans << "\n"; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...