Submission #1370492

#TimeUsernameProblemLanguageResultExecution timeMemory
1370492solution6312Lawn Mower (CEOI25_lawnmower)C++17
100 / 100
438 ms239996 KiB
#include "lawn.h"
#include <iostream>
#include <cassert>
using namespace std;
using ll=long long;

namespace
{
    const int MN=2e5+13;
    const ll inf64=1e18;
    int N; ll C, B;
    ll A[MN], V[MN], pre[MN];
}
namespace seg
{
    ll st[MN<<5], te[MN<<5], mid[MN<<5];
    ll mn[MN<<5], lz[MN<<5];
    int lp[MN<<5], rp[MN<<5], idx=0;
    int build(ll l, ll r)
    {
        int u=++idx;
        st[u]=l; te[u]=r; mid[u]=(st[u]+te[u])>>1;
        mn[u]=inf64; lz[u]=0;
        return u;
    }
    void build(int u)
    {
        if (!lp[u]) lp[u]=build(st[u], mid[u]);
        if (!rp[u]) rp[u]=build(mid[u]+1, te[u]);
    }
    void prop(int u)
    {
        if (!lz[u]) return;
        mn[lp[u]]+=lz[u];
        lz[lp[u]]+=lz[u];
        mn[rp[u]]+=lz[u];
        lz[rp[u]]+=lz[u];
        lz[u]=0;
    }
    void set(int u, ll p, ll x)
    {
        if (st[u]==te[u])
        {
            mn[u]=x;
            return;
        }
        build(u);
        prop(u);
        if (p<=mid[u]) set(lp[u], p, x);
        else set(rp[u], p, x);
        mn[u]=min(mn[lp[u]], mn[rp[u]]);
    }
    void upd(int u, ll l, ll r, ll x)
    {
        if (st[u]==l && te[u]==r)
        {
            mn[u]+=x;
            lz[u]+=x;
            return;
        }
        build(u);
        prop(u);
        if (l<=mid[u]) upd(lp[u], l, min(r, mid[u]), x);
        if (r>mid[u]) upd(rp[u], max(mid[u]+1, l), r, x);
        mn[u]=min(mn[lp[u]], mn[rp[u]]);
    }
    ll qry(int u, ll p)
    {
        if (st[u]==te[u]) return mn[u];
        build(u);
        prop(u);
        if (p<=mid[u]) return qry(lp[u], p);
        else return qry(rp[u], p);
    }
    ll qry(int u, ll l, ll r)
    {
        if (st[u]==l && te[u]==r) return mn[u];
        build(u);
        prop(u);
        ll z=inf64;
        if (l<=mid[u]) z=min(z, qry(lp[u], l, min(r, mid[u])));
        if (r>mid[u]) z=min(z, qry(rp[u], max(mid[u]+1, l), r));
        return z;
    }
}

ll mow(int n, int c, int b, vector<int> &a, vector<int> &v)
{
    N=n; C=c; B=b;
    for (int i=1; i<=N; i++) A[i]=a[i-1];
    for (int i=1; i<=N; i++)
    {
        V[i]=v[i-1];
        pre[i]=(pre[i-1]+V[i])%C;
    }
    seg::build(0, C-1);
    seg::set(1, 0, 0);
    for (int i=1; i<=N; i++)
    {
        ll cnt=V[i]/C;
        seg::upd(1, 0, C-1, B*cnt+A[i]*(cnt+1));
        if (V[i]%C)
        {
            int L=(C-pre[i])%C, R=C-pre[i-1]-1;
            if (L<=R) seg::upd(1, L, R, B+A[i]);
            else
            {
                seg::upd(1, L, C-1, B+A[i]);
                seg::upd(1, 0, R, B+A[i]);
            }
        }
        ll z=min(seg::qry(1, (C-pre[i])%C)-A[i], seg::qry(1, 0, C-1)+B);
        seg::set(1, (C-pre[i])%C, z);
    }
    return seg::qry(1, (C-pre[N])%C);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...