Submission #424386

#TimeUsernameProblemLanguageResultExecution timeMemory
424386Osama_AlkhodairyFinancial Report (JOI21_financial)C++17
100 / 100
343 ms12100 KiB
#include <bits/stdc++.h>
using namespace std;
#define finish(x) return cout << x << endl, 0
#define ll long long

const int N = 300001;

int n, d, tree[2 * N];
vector <int> a;

void update(int p, int v){
    for(tree[p += n] = v ; p > 1 ; p >>= 1){
        tree[p >> 1] = max(tree[p], tree[p ^ 1]);
    }
}
int query(int l, int r){
    r++;
    int ret = 0;
    for(l += n, r += n ; l < r ; l >>= 1, r >>= 1){
        if(l & 1) ret = max(ret, tree[l++]);
        if(r & 1) ret = max(ret, tree[--r]);
    }
    return ret;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> d;
    a.resize(n);
    for(auto &i : a) cin >> i;
    vector <pair <int, int> > all;
    for(int i = 0 ; i < n ; i++){
        all.push_back(make_pair(a[i], i));
    }
    sort(all.begin(), all.end(), [&](pair <int, int> &l, pair <int, int> &r){
        return make_pair(l.first, -l.second) < make_pair(r.first, -r.second);
    });
    set <pair <int, int> > s;
    vector <int> f(n);
    for(auto &i : all){
        int idx = i.second;
        auto cur = make_pair(idx, idx);
        auto it = s.lower_bound(make_pair(idx, -1));
        vector <pair <int, int> > to_erase;
        if(it != s.end() && idx + d >= it->first){
            cur.second = it->second;
            to_erase.push_back(*it);
        }
        if(it != s.begin()){
            it--;
            if(idx - d <= it->second){
                cur.first = it->first;
                cur.second = max(cur.second, it->second);
                to_erase.push_back(*it);
            }
        }
        for(auto &j : to_erase){
            s.erase(j);
        }
        f[idx] = min(cur.second + d, n - 1);
        s.insert(cur);
    }
    vector <int> dp(n);
    sort(all.begin(), all.end(), [&](pair <int, int> &l, pair <int, int> &r){
        return make_pair(-l.first, l.second) < make_pair(-r.first, r.second);
    });
    for(auto &i : all){
        int idx = i.second;
        dp[idx] = query(idx, f[idx]) + 1;
        update(idx, dp[idx]);
    }
    int ans = 0;
    for(auto &i : dp) ans = max(ans, i);
    cout << ans << endl;
}
#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...