Submission #608846

#TimeUsernameProblemLanguageResultExecution timeMemory
608846DeMen100nsFinancial Report (JOI21_financial)C++17
100 / 100
757 ms31080 KiB
/*
Author : DeMen100ns (a.k.a Vo Khac Trieu)
School : VNU-HCM High school for the Gifted
fuck you adhoc
*/

#include <bits/stdc++.h>

using namespace std;

const int N = 3e5 + 5;
const long long INF = numeric_limits<long long>::max() / 2;
const int MAXA = 1e9;
const int B = sqrt(N) + 5;

int a[N];

struct segtree{
    int seg[4 * N], lazy[4 * N];

    segtree(){
        fill(lazy + 1, lazy + 4 * N, -1);
    }

    void down(int id){
        int t = lazy[id];

        seg[id << 1] = seg[id << 1 | 1] = t;
        lazy[id << 1] = lazy[id << 1 | 1] = t;

        lazy[id] = -1;
    }

    void upd(int id, int l, int r, int u, int v, int val){
        if (l > v || r < u) return;
        if (l >= u && r <= v){
            seg[id] = lazy[id] = val;
            return;
        }
        if (lazy[id] != -1) down(id);

        int mid = (l + r) >> 1;
        upd(id << 1, l, mid, u, v, val);
        upd(id << 1 | 1, mid + 1, r, u, v, val);

        seg[id] = max(seg[id << 1], seg[id << 1 | 1]);
    }

    int get(int id, int l, int r, int u, int v){
        if (l > v || r < u) return 0;
        if (l >= u && r <= v) return seg[id];
        if (lazy[id] != -1) down(id);

        int mid = (l + r) >> 1;
        int v1 = get(id << 1, l, mid, u, v);
        int v2 = get(id << 1 | 1, mid + 1, r, u, v);

        return max(v1, v2);
    }

    //note : day[1] <= day[2] <= ... <= day[n]
    int getl(int id, int l, int r, int v){
        if (l == r) return l;
        if (lazy[id] != -1) down(id);

        int mid = (l + r) >> 1;
        if (seg[id << 1] < v){
            return getl(id << 1 | 1, mid + 1, r, v);
        } else {
            return getl(id << 1, l, mid, v);
        }
    }

    void dbgseg(int n){
        for(int i = 1; i <= n; ++i){
            cout << get(1, 1, n, i, i) << " ";
        } cout << endl;
    }
} day, dp, cur;

void cmp(int n){
    vector <int> v;
    for(int i = 1; i <= n; ++i) v.push_back(a[i]);
    sort(v.begin(), v.end());
    for(int i = 1; i <= n; ++i){
        a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
    }
}

void solve()
{
    int n, d; cin >> n >> d;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
    cmp(n);

    for(int i = 1; i <= n; ++i){
        int ma = 0, k = n + 1;

        k = day.getl(1, 1, n, i - d);
        if (k < a[i]) ma = cur.get(1, 1, n, k, a[i] - 1);
        
        day.upd(1, 1, n, a[i], n, i);

        int val = cur.get(1, 1, n, a[i], a[i]);
        val = max(val, ma + 1);
        cur.upd(1, 1, n, a[i], a[i], val);
        val = max(val, dp.get(1, 1, n, a[i], a[i]));
        dp.upd(1, 1, n, a[i], a[i], val);

        if (i - day.seg[1] >= d) k = n + 1;
        else {
            k = day.getl(1, 1, n, i - d + 1);
        }
        cur.upd(1, 1, n, 1, k - 1, 0);

        /*day.dbgseg(n);
        dp.dbgseg(n);
        cur.dbgseg(n);
        cout << "----------" << endl;*/
    }

    /*for(int i = 1; i <= n; ++i){
        int ma = 0;
        for(int j = 1; j < a[i]; ++j){
            if (i - day[j] <= d){
                ma = max(ma, cur[j]);
            }
        }
        for(int j = a[i]; j <= n; ++j){
            day[j] = i;
        }
        cur[a[i]] = max(cur[a[i]], ma + 1);

        for(int j = 1; j <= n; ++j){
            dp[j] = max(dp[j], cur[j]);
            if (i - day[j] == d){
                cur[j] = 0;
            }
        }
        dbg(day, 1, n);
        dbg(dp, 1, n);
        dbg(cur, 1, n);
        dbg("--------");
    }*/
    cout << dp.get(1, 1, n, a[n], n);
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    // freopen("codeforces.inp","r",stdin);
    // freopen("codeforces.out","w",stdout);

    int t = 1; //cin >> t;
    while (t--)
    {
        solve();
    }
}
#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...