Submission #1106272

#TimeUsernameProblemLanguageResultExecution timeMemory
1106272alexddThe short shank; Redemption (BOI21_prison)C++17
70 / 100
2072 ms46416 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n,d,lim;
int t[2000005];
bool blocat[2000005];
int tole[2000005];

pair<int,int> aint[4200000];
int lazy[4200000];
void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        aint[nod] = {0,st};
        return;
    }
    int mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
    aint[nod] = max(aint[nod*2], aint[nod*2+1]);
}
void propagate(int nod)
{
    lazy[nod*2] += lazy[nod];
    lazy[nod*2+1] += lazy[nod];
    aint[nod*2].first += lazy[nod];
    aint[nod*2+1].first += lazy[nod];
    lazy[nod]=0;
}
void upd(int nod, int st, int dr, int le, int ri, int newv)
{
    if(le>ri)
        return;
    if(le==st && dr==ri)
    {
        aint[nod].first += newv;
        lazy[nod] += newv;
        return;
    }
    propagate(nod);
    int mij=(st+dr)/2;
    upd(nod*2,st,mij,le,min(mij,ri),newv);
    upd(nod*2+1,mij+1,dr,max(mij+1,le),ri,newv);
    aint[nod] = max(aint[nod*2], aint[nod*2+1]);
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>d>>lim;
    build(1,1,n);
    for(int i=1;i<=n;i++)
    {
        cin>>t[i];
        tole[i] = n+1;
        for(int j=i;j>0;j--)
        {
            if(t[j] + (i-j) <= lim)
            {
                tole[i] = j;
                break;
            }
        }
        upd(1,1,n,tole[i],i,+1);
    }
    for(int pas=1;pas<=d;pas++)
    {
        /*int mxm=0,unde=-1;
        for(int i=1;i<=n;i++)
        {
            int cnt=0;
            for(int j=i+1;j<=n;j++)
                if(tole[j]<=i)
                    cnt++;
            if(cnt>mxm)
            {
                mxm = cnt;
                unde = i;
            }
        }
        if(unde==-1)
            break;*/
        int unde = aint[1].second;
        blocat[unde]=1;
        for(int i=unde+1;i<=n;i++)
        {
            if(tole[i]<=unde)
            {
                upd(1,1,n,tole[i],i,-1);
                tole[i] = n+1;
            }
        }
    }
    int rez=0;
    int mnm=INF;
    for(int i=1;i<=n;i++)
    {
        if(blocat[i-1])
            mnm=INF;
        mnm = min(mnm, t[i]-i);
        if(mnm <= lim-i)
            rez++;
    }
    cout<<rez;
    return 0;
}
/*
pentru fiecare pozitie i ne intereseaza doar cea mai din dreapta pozitie j aflata in stanga ei care respecta
j <= i
t[j] + (i-j) <= lim
t[j] - j <= lim - i


*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...