제출 #1103755

#제출 시각아이디문제언어결과실행 시간메모리
1103755vjudge1Fish 3 (JOI24_fish3)C++17
100 / 100
301 ms65608 KiB
#include<bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const ll maxn = 1e6 + 2, LG = 21, mod = 998244353, inf = 1e18;
ll n, d, c[maxn], q, l[maxn], r[maxn], fw_add[maxn], fw_mul[maxn], par[maxn], res[maxn];
vector<int> qr[maxn];
void upd (int idx, ll val)
{
    ll ok = -val*(idx - 1);
    while (idx <= n)
    {
        fw_add[idx] += ok;
        fw_mul[idx] += val;
        idx += (idx & (-idx));
    }
}
ll get (int idx)
{
    ll add = 0, mul = 0, i = idx;
    while (idx > 0)
    {
        add += fw_add[idx];
        mul += fw_mul[idx];
        idx -= (idx & (-idx));
    }
    return add + mul*i;
}
int find_set (int u)
{
    if (par[u] == u) return u;
    return (par[u] = find_set(par[u]));
}
void union_set (int u, int v)
{
    int pu = find_set(u), pv = find_set(v);
    par[pu] = pv;
}
int main ()
{
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> d;
    for (int i = 1; i <= n; i++)
    {
        cin >> c[i];
        par[i] = i;
    }
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        cin >> l[i] >> r[i];
        qr[r[i]].push_back(i);
    }
    for (int i = 1; i <= n; i++)
    {
        int u = i;
        while (u > 1)
        {
            ll x = c[u] - d * (get(u) - get(u - 1)), y = c[u - 1] - d * (get(u - 1) - get(u - 2));
            if (y <= x) break;
            union_set(u, u - 1);
            int l = find_set(u - 1);
            upd(l, (y - x + d - 1)/d);
            upd(u, -(y - x + d - 1)/d);
            u = l;
        }
        for (int j : qr[i])
        {
            if (c[l[j]] - d * (get(l[j]) - get(l[j] - 1)) < 0) res[j] = -1;
            else res[j] = get(i) - get(l[j] - 1);
        }
    }
    for (int i = 1; i <= q; i++) cout << res[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...