Submission #479397

#TimeUsernameProblemLanguageResultExecution timeMemory
479397nicolaalexandraFinancial Report (JOI21_financial)C++14
100 / 100
670 ms23380 KiB
#include <bits/stdc++.h>
#define DIM 300010
using namespace std;

pair <int,int> v[DIM];
set <int> s;
int t[DIM],poz_min[DIM],aint[DIM*4];
int n,d,i,j;

inline int cmp (pair<int,int> a, pair<int,int> b){
    if (a.first == b.first)
        return a.second > b.second;
    return a.first < b.first;
}

inline int get_rad (int x){
    while (t[x] > 0)
        x = t[x];
    return x;
}


void uneste (int x, int y){

    int radx = get_rad(x), rady = get_rad(y);
    if (radx == rady)
        return;

    if (t[radx] > t[rady])
        swap (radx,rady);

    t[radx] += t[rady];
    t[rady] = radx;

    poz_min[radx] = min (poz_min[radx],poz_min[rady]);
}

void update (int nod, int st, int dr, int poz, int val){
    if (st == dr){
        aint[nod] = val;
        return;
    }
    int mid = (st+dr)>>1;
    if (poz <= mid)
        update (nod<<1,st,mid,poz,val);
    else update ((nod<<1)|1,mid+1,dr,poz,val);

    aint[nod] = max (aint[nod<<1],aint[(nod<<1)|1]);
}

int query (int nod, int st, int dr, int x, int y){
    if (x <= st && dr <= y)
        return aint[nod];

    int mid = (st+dr)>>1, sol_st = 0, sol_dr = 0;
    if (x <= mid)
        sol_st = query (nod<<1,st,mid,x,y);
    if (y > mid)
        sol_dr = query ((nod<<1)|1,mid+1,dr,x,y);
    return max (sol_st,sol_dr);
}

inline int modul (int n){
    return max (n,-n);
}

int main (){

    //ifstream cin ("date.in");
    //ofstream cout ("date.out");

    cin>>n>>d;
    for (i=1;i<=n;i++){
        cin>>v[i].first;
        v[i].second = i;

        t[i] = -1;
        poz_min[i] = i;
    }

    sort (v+1,v+n+1,cmp);

    for (i=1;i<=n;i++){

        /// fac padurile
        int poz = v[i].second;
        set <int> :: iterator it = s.lower_bound (poz);
        if (it != s.end()){
            if (modul(*it - poz) <= d)
                uneste (*it,poz);
        }
        if (it != s.begin()){
            it--;
            if (modul(*it - poz) <= d)
                uneste (*it,poz);
        }

        s.insert(poz);


        int poz2 = poz_min[get_rad(poz)];

        int val = 1;
        if (poz2 < poz)
            val = max(val, query (1,1,n,poz2,poz) + 1);

        update (1,1,n,poz,val);
    }

    cout<<aint[1];

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