제출 #1221850

#제출 시각아이디문제언어결과실행 시간메모리
1221850ErJFinancial Report (JOI21_financial)C++20
19 / 100
251 ms43640 KiB
#include <bits/stdc++.h>

#define ll long long
#define vi vector<ll>
#define vvi vector<vi>
#define pp pair<ll, ll>
#define vp vector<pp>
#define inf 2000000000


using namespace std;

vi Itree;

void init(ll n){
    while(n & (n - 1)) n++;
    Itree.resize(2*n, 0);
}

void update(ll ind, ll val){
    ind += Itree.size() / 2;
    Itree[ind] = val;
    while(ind > 1){
        ind /= 2;
        Itree[ind] = max(Itree[ind * 2], Itree[2*ind + 1]);
    }
}

ll get2(ll u, ll l, ll r, ll a, ll b){
    if(l == a && r == b){;
        return Itree[u];
    }
    ll s = (a + b) / 2;
    if(s >= r){
        return get2(2*u, l, r, a, s);
    }else if(s <= l){
        return get2(2*u + 1, l, r, s, b);
    }else{
        return max(get2(2*u, l, s, a, s), get2(2*u + 1, s, r, s, b));
    }
}

ll get(ll l, ll r){
    return get2(1, l, r, 0, Itree.size() / 2);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n, d;
    cin >> n >> d;
    vi A(n, 0);
    vp B(n);
    vi pos(n), left(n);
    for(int i = 0; i < n; i++){
        cin >> A[i];
        B[i] = {A[i], i};
    }
    sort(B.begin(), B.end());
    init(n);
    left[0] = -1;
    for(int i = 0; i < n; i++){
        pos[B[i].second] = i;
        if(i > 0){
            if(B[i].first > B[i - 1].first) left[i] = i;
            else left[i] = left[i - 1];
        }
    }

    multiset<ll> ms;
    vi minD(n, inf);
    for(int i = 0; i <= d; i++){
        ms.insert(A[i]);
    }
    for(int i = d + 1; i < n; i++){
        minD[i - d - 1] = *ms.begin();
        ms.erase(ms.find(A[i - d - 1]));
        ms.insert(A[i]);
    }

    set<pp> active;

    vi dp(n, 0);
    ll ans = 0;
    for(int i = 0; i < n; i++){
        while(i > d && active.size() > 0 && (*active.begin()).first < minD[i - d]){
            pp deact = *active.begin();
            active.erase(active.begin());
            update(pos[deact.second], 0);
        }
        ll x = 0;
        if(left[pos[i]] != -1){
            x = get(0, left[pos[i]]);
        }
        dp[i] = 1 + x;
        update(pos[i], dp[i]);
        if(i >= d) active.insert({A[i - d], i - d});
        ans = max(ans, dp[i]);
    }

    cout << ans << '\n';
}


/*
7 1
100 600 600 200 300 500 500


11 2
1 4 4 2 2 4 9 5 7 0 3

8 8         
15 1 6 6 6 7 8 7

6 6
100 500 200 400 600 300
*/
#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...