Submission #561479

#TimeUsernameProblemLanguageResultExecution timeMemory
561479SirCovidThe19thFinancial Report (JOI21_financial)C++17
100 / 100
521 ms24652 KiB
#include <bits/stdc++.h>
using namespace std; 

const int mx = 3e5 + 5;

int n, d, val[mx], ord[mx], par[mx], L[mx], seg[mx * 2]; set<int> S({-mx, mx * 2});

int get(int i){ 
    return i == par[i] ? i : par[i] = get(par[i]); 
}
void merge(int a, int b){
    a = get(a); b = get(b); 
    par[a] = b; L[b] = min(L[b], L[a]);
}
void upd(int i, int val){
    seg[i += mx] = val;
    for (i /= 2; i > 0; i /= 2) seg[i] = max(seg[i * 2], seg[i * 2 + 1]);
}
int qry(int l, int r){ 
    int ret = 0;
    for (l += mx, r += mx; l <= r; r /= 2, l /= 2){
        if (l % 2 == 1) ret = max(ret, seg[l++]);
        if (r % 2 == 0) ret = max(seg[r--], ret);
    }
    return ret;
}

int main(){
    cin >> n >> d;
    for (int i = 1; i <= n; i++){
        cin >> val[i];
        par[i] = L[i] = ord[i] = i;
    }
    sort(ord + 1, ord + n + 1, [&](int a, int b){ 
        return val[a] != val[b] ? (val[a] < val[b]) : (a > b);
    });
    for (int i = 1; i <= n; i++){
        auto it = S.lower_bound(ord[i]);
        if (*it - ord[i] <= d) merge(ord[i], *it);
        if (ord[i] - *prev(it) <= d) merge(ord[i], *prev(it));
        S.insert(ord[i]);
        upd(ord[i], qry(L[get(ord[i])], ord[i]) + 1);
    }
    cout<<qry(1, mx)<<"\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...
#Verdict Execution timeMemoryGrader output
Fetching results...