Submission #1343192

#TimeUsernameProblemLanguageResultExecution timeMemory
1343192tiendat175Financial Report (JOI21_financial)C++20
100 / 100
334 ms25676 KiB
#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<int , pair<int , int>>
#define lii pair<long long , pair<int , int>>
#define iii pair<int , pair<int , int>>
#define li pair<long long , long long>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))
#define ill pair<int , pair<long long , long long>>
#define lli pair<pair<long long , long long> , pair<int , int>>

const long long MOD = 1e9 + 7;
const int N = 3e5 + 7;
int n , d;
int par[N] , mn[N] , t[4 * N];

struct gv{
    long long val;
    int id;
};

gv a[N];

bool cmp(gv x , gv y){
    if (x.val != y.val) return x.val < y.val;
    return x.id > y.id;
}

void inp(){
    cin >> n >> d;
    for (int i = 1 ; i <= n ; ++i){
        cin >> a[i].val;
        a[i].id = i;
    }

    sort(a + 1 , a + n + 1 , cmp);
    for (int i = 1 ; i <= n ; ++i){
        par[i] = i;
        mn[i] = i;
    }
}

int find_par(int u){
    if (u == par[u]) return u;
    return find_par(par[u]);
}

void Union(int u , int v){
    u = find_par(u) , v = find_par(v);
    if (u == v) return;
    par[v] = u;
    mn[u] = min(mn[u] , mn[v]);
}

void update(int id , int l , int r , int pos , int val){
    if (l > pos || r < pos) return;

    if (l == r){
        t[id] = val;
        return;
    }

    int mid = (l + r) >> 1;
    update(id << 1 , l , mid , pos , val);
    update(id << 1 | 1 , mid + 1 , r , pos , val);
    t[id] = max(t[id << 1] , t[id << 1 | 1]);
}

int get(int id , int l , int r , int u , int v){
    if (u > v) return 0;
    if (l > v || r < u) return 0;
    if (u <= l && r <= v) return t[id];

    int mid = (l + r) >> 1;
    int t1 = get(id << 1 , l , mid , u , v);
    int t2 = get(id << 1 | 1 , mid + 1 , r , u , v);
    return max(t1 , t2);
}

void solve(){
    set<int> s;
    int res = 0;
    for (int i = 1 ; i <= n ; ++i){
        auto it = s.lower_bound(a[i].id);

        if (it != s.end()){
            if (abs(*it - a[i].id) <= d) Union(*it , a[i].id);
        }

        if (it != s.begin()){
            --it;
            if (abs(*it - a[i].id) <= d) Union(*it , a[i].id);
        }
        s.insert(a[i].id);

        int st = mn[find_par(a[i].id)];
        int tmp = get(1 , 1 , n , st , a[i].id - 1) + 1;
        res = max(res , tmp);

        update(1 , 1 , n , a[i].id , tmp);
    }
    cout << res;
}

int main(){
//    freopen("pine.inp" , "r" , stdin);
//    freopen("pine.out" , "w" , stdout);
    faster;
    inp();
    solve();
    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...